我对mongodb很新,我有点失落。
我有mongo db集合,如下所示:
({
_id:id ,
createdAt: new Date(),
name:name,
friends : [{name:1,children:[{name:sarah,age:12}]}],
dogs : [{}]
});
如果名称不存在,那么我希望能够在friends数组中插入一个新元素,并将子元素插入到该新数组中。
伪代码
If Directory.find id.friends.name = true
update and add a new children document {name:"sarah",age:5}
else
make a new friend element with a new children subdocument
经过大量研究后,人们似乎建议使用$ exists但我找不到在子文档中使用它的方法'
我已经想出了这个,但它并没有真正发挥作用,我想知道我怎么能用它作为我的if else stament:
db.Directory.find({_id:id},{friends.name:"foo", {"$exists": True}})
对于实际查询
db.Directory.update(
{ _id: id, 'friends.name': "foo" },
{$push: {'friends.$.children': {name:"x",age:"yy"}}}
)
如果它不存在:
db.Directory.insert(
{ _id: id, 'friends.name': "foo" },
{$push: {'friends.$.children': {name:"x",age:"yy"}}}
)
但它并没有真正起作用,我不确定我的公式是否有问题,因为这是研究中的大量试验和错误。 我也不知道是否正确的方法,因为我找不到任何关于子文档上存在的值的东西,并且正计划尝试进行Find()搜索存储该值,然后测试true或者对JS中的结果进行false以进行更新/插入调用。
希望有人可以提供帮助
编辑: 假设我想将{name:john,年龄:15}添加到该朋友的名字:1
friends : [{name:1,children:[{name:sarah,age:12}]}]
我希望输出为
friends : [{name:1,children:[{name:sarah,age:12},{name:john,age:15}]}]
或名称1不存在
friends : []
使它输出
friends : [{name:1,children:[{name:john,age:15}]}]
更新示例:
案例一:
friends : []
我添加一个新朋友的名字“josh”和一个孩子莎拉,12岁我得到:
friends : [{name:"josh",children:[{name:sarah,age:12}]}]
这很完美。
Now i add a new friend name 2 with children tom 15.
什么都没发生。
之后,我想给josh添加一个新的孩子,15岁的时候。我明白了:
friends : [{name:"josh",children:[{name:timmy,age:12}]}]
莎拉失望了。
答案 0 :(得分:3)
请尝试通过Bulk operation
执行此操作,通过$addToSet
操作员添加一位新朋友,并通过$set
操作员更新朋友,在您更清楚地提出问题后进行更新。
var bulk = db.Directory.initializeOrderedBulkOp();
// if `friends` is `[]`, push the empty children firstly through addToSet
bulk.find({_id: id, 'friends.name': {$exists: false}}).updateOne(
{$addToSet: {friends: {name: 1, children: []}});
// if we find the match friend, update this one through `$set`
bulk.find({_id: id, 'friends.children.name': 'john'}).updateOne(
{$set: {'friends.$.children': {name: 'john', age: 22}}});
// if we cannot find match friend, insert the new one through `$addToSet`
bulk.find({_id: id, 'friends.children.name': {$ne: "john"}}).updateOne(
{$addToSet: {'friends.0.children': {name: 'john', age: 12}}});
bulk.execute();