Meteor / Mongo - 动态地在子数组中添加/更新元素

时间:2017-02-26 13:38:39

标签: mongodb meteor

所以我发现SO上关于如何更新子数组中的字段的相关帖子很少,例如这个here

我想要实现的基本相同,但是动态更新子数组中的字段,而不是仅仅在查询中调用字段名称。 现在我也发现如何在主对象中直接做到这一点,但似乎无法在子数组中进行。

在子对象中动态插入的代码:

_.each(data.data, function(val, key) {
  var obj = {};
  obj['general.'+key] = val;
  insert = 0 || (Documents.update(
    { _id: data._id },
    { $set: obj}
  ));
});

以下是我要做的事情的树:

Documents: {
 _id: '123123'
 ...
 smallRoom:
  [
    _id: '456456'
    name: 'name1'
    description: 'description1'
  ],
  [
  ...
  ]
}

这是我的代码:

// insert a new object in smallRoom, with only the _id so far 
var newID = new Mongo.ObjectID;
var createId = {_id: newID._str};
Documents.update({_id: data._id},{$push:{smallRooms: createId}})

插入其他字段的部分:

_.each(data.data, function(val, key) {
  var obj = {};
  obj['simpleRoom.$'+key] = val;
  console.log(Documents.update(
    { 
      _id: data._id,    <<== the document id that I want to update
      smallRoom: { 
        $elemMatch:{
          _id : newID._str,   <<== the smallRoom id that I want to update
        }
      }
    },
    { 
      $set: obj
    }
  ));
});

好的,说完了,我知道我可以直接插入整个物体,而不必推动每一个场地。

但是我想这个问题更像是,如果smallRoom有50个字段,它是如何工作的,我想更新3个随机字段? (所以我需要使用_each循环,因为我事先不知道要更新哪个字段,并且不想替换整个对象)

1 个答案:

答案 0 :(得分:1)

我不确定我是否100%理解您的问题,但我认为您要问的答案是使用$符号。

示例:

Documents.update(
    { 
      _id: data._id, smallRoom._id: newID._str
    },
    { 
      $set: { smallroom.$.name: 'new name' }
    }
);

您找到的文档与_iddata._id匹配,然后在数组smallRoom中找到_id等于newId._str的对象。然后,您使用$符号告诉Mongo更新该对象的name密钥。

希望有所帮助