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

时间:2016-02-28 12:32:32

标签: javascript mongodb meteor

我有以下代码:

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 }
    });

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

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

2 个答案:

答案 0 :(得分:0)

我认为目前还没有直接的方法将Map对象插入MongoDB。我建议的一个可能的解决方法是:

  1. 迭代Map对象,
  2. 将键值对分别存储在DB
  3. 架构可能如下所示:

    std::list

    将Map对象转换为此格式的Helper函数反之亦然,必须写入该效果。

答案 1 :(得分:0)

在您的示例中,您具有这样的模型:

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 }
});

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