我有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"
答案 0 :(得分:1)
这样做的一种方法是,
insert/update
该对象可以同时插入多个子项。
var obj = {name:"tommy",children:[{name:"ds",age:12},{name:"two",age:12}]};
Bulk API
。 此处的操作顺序无关紧要。
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();