按元素

时间:2016-03-04 12:02:35

标签: mongodb meteor

我有mongo db集合,如下所示:

({
  _id:id ,
  createdAt: new Date(),
  name:name,
  friends : [{name:"tommy",children:[{name:"sarah",age:12}]}],
  dogs : [{}]
});

如果名称不存在,那么我希望能够在friends数组中插入一个新元素,并将子元素插入到该新数组中。

如果我正在为一个名为john的新朋友添加一个孩子nathaly,我希望输出为

({
  _id:id ,
  createdAt: new Date(),
  name:name,
  friends : [{name:"tommy",children:[{name:"sarah",age:12}]},{name:"john",children:[{name:"natahly",age:20}]}],
  dogs : [{}]
});

如果朋友tommy已经存在,我希望将孩子们添加到children数组中,输出现在为

({
  _id:id ,
  createdAt: new Date(),
  name:name,
  friends : [{name:"tommy",children:[{name:"sarah",age:12},{name:"newchild",age:99}]},{name:"john",children:[{name:"natahly",age:20}]}],
  dogs : [{}]
});

我已经尝试了很多事情list已经不可能了。

目前我正在尝试混合所有内容

  // if `friends` is `[]`, push the empty children firstly through addToSet
  var bulk = Directory.rawCollection().initializeUnorderedBulkOp();
  bulk.find({_id: id, 'friends.name': {$exists: false}}).updateOne(
 {$addToSet: {friends: {name: name_var, children: []}});
  Meteor.wrapAsync(bulk.execute)();
  // then Since previous step create the children array for said friend only if it doesn't already exist i'm just trying to update said friend with the new child
  Directory.update(
  { _id: id,"friends.name": name_var },
  { $push: { "friends.$.children": {name:"sarah",age:12}
  }}})

(我还试过和#34; friends.children"而不是"朋友。$。孩子"但我只是得到了不同的错误)

这应该涵盖我的三个案例,但我遇到了问题,我想知道我是否采取了正确的方式。你们中的任何人都有任何想法,因为this至少应该努力增加孩子,但它并没有......

Errors : MongoError: The field 'friends.0.children' must be an array but is of type Object in document {_id: "0"} # when friends.$.children"

MongoError: cannot use the part (Friends of Friends.childrens) to traverse the element when friends.children"

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是,

  • 初始化您想要的对象insert/update

该对象可以同时插入多个子项。

var obj = {name:"tommy",children:[{name:"ds",age:12},{name:"two",age:12}]};

此处的操作顺序无关紧要。

var bulk = db.t.initializeUnorderedBulkOp();
  • 查找并update仅显示已有name子文档的子记录。

使用$addToSet运算符维护唯一记录,$each一次添加多个子目录。

bulk.find({"friends.name":obj.name})
    .update({$addToSet:{"friends.$.children":{$each:obj.children}}});
  • 查找并update 的子文档。
如果文档没有文件,则

$push整个对象。

bulk.find({"friends.name":{$ne:obj.name}})
    .update({$push:{"friends":obj}});
bulk.execute();