我可以将JavaScript Map对象存储在Meteor的MongoDB中吗?

Can I Store the JavaScript Map Object in Meteor's MongoDB?

本文关键字:Meteor MongoDB 中吗 存储 JavaScript Map 对象 我可以      更新时间:2023-09-26

我有以下代码:

myMapField = new Map();
for (var i = stuff.length; i--; ) {
    myMapField.set(stuff.id, { name: stuff.name, type: Types.MY_TYPE });
}
Meteor.users.update(Meteor.userId(), {
        $set: { 'profile.myMapField': myMapField }
    });

它不起作用,错误消息没有帮助("未定义")。

有没有办法将JavaScript Map对象存储在Meteor的MongoDB中?

我认为目前

还没有直接的方法可以将Map对象插入MongoDB。我可以建议的一种可能的解决方法是:

  1. 循环访问 Map 对象,然后
  2. 将键值对单独存储在数据库中

架构可能如下所示:

{
  _id: someId,
  map: [{
         key: key1,
         value: value1
       },{
         key: key2,
         value: value2
       },{
         key: key3,
         value: value3
       },{
         key: key4,
         value: value4
       },{
         ...
       }]
}

用于将 Map 对象转换为此格式(反之亦然)的帮助程序函数必须为此效果进行写入。

从您的示例中,您有一个这样的模型:

const profile = {
  myMapField: {
    id: { name: "name1", type: "type1"}
  }
}

然后你有一个地图而不是一个对象,因为你想享受地图的所有好处。没有用于Map的模式类型,但在插入到mongodb文档之前,解决方法是使用简单的函数将地图转换为普通对象。

const myMapField = new Map();
for (var i = stuff.length; i--; ) {
    myMapField.set(stuff.id, { name: stuff.name, type: Types.MY_TYPE });
}
const mapToObj = map => {
  let object = {};
  for (const [key, value] of map) {
    object[key] = value;    
  }
  return object;
}
const objectFromMap = mapToObj(myMapField);
console.log(objectFromMap) 
//{ id1: { name: 'id1', type: 'type1' }, id2: { name: 'id2', type: 'type2' } }
Meteor.users.update(Meteor.userId(), {
  $set: { 'profile.myMapField': objectFromMap }
});

使用此方法,您可以轻松地将地图转换为对象并进行插入。