如果子文档值不存在,Mongo DB 将插入到子文档中

use*_*697 4 javascript mongodb meteor mongodb-query

我对 mongodb 很陌生,我有点迷茫。

我有一个看起来像这样的 mongo db 集合:

  ({
    _id:id ,
    createdAt: new Date(),
    name:name,
    friends : [{name:1,children:[{name:sarah,age:12}]}],
    dogs : [{}]
  });
Run Code Online (Sandbox Code Playgroud)

如果名称不存在,我希望能够在朋友数组中插入一个新元素,并且在该新数组中插入一个子元素。

伪代码将是

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

经过大量研究,似乎人们推荐使用 $exist 但我找不到在子文档中使用它的方法

我想出了这个,但它并没有真正起作用,我想知道如何将它用于我的 if else stament:

db.Directory.find({_id:id},{friends.name:"foo", {"$exists": True}})
Run Code Online (Sandbox Code Playgroud)

对于实际查询

db.Directory.update(
    { _id: id, 'friends.name': "foo" },
    {$push: {'friends.$.children':  {name:"x",age:"yy"}}}
)
Run Code Online (Sandbox Code Playgroud)

如果它不存在:

db.Directory.insert(
    { _id: id, 'friends.name': "foo" },
    {$push: {'friends.$.children':  {name:"x",age:"yy"}}}
)
Run Code Online (Sandbox Code Playgroud)

但它并没有真正起作用,我不确定我的公式是否有问题,因为它是研究中的大量试验和错误。我也真的不知道这是否是正确的方法,因为我在子文档中存在的值上找不到任何内容,并且正计划尝试进行 Find() 搜索存储该值,然后测试是否为 true 或JS 中的结果为 false 以进行任一更新/插入调用。

希望有人能帮忙

编辑:假设我想将 {name:john,age:15} 添加到那个朋友 name:1

friends : [{name:1,children:[{name:sarah,age:12}]}]
Run Code Online (Sandbox Code Playgroud)

我希望输出是

friends : [{name:1,children:[{name:sarah,age:12},{name:john,age:15}]}]
Run Code Online (Sandbox Code Playgroud)

或者如果名称 1 不存在

friends : []
Run Code Online (Sandbox Code Playgroud)

让它输出

friends : [{name:1,children:[{name:john,age:15}]}]
Run Code Online (Sandbox Code Playgroud)

更新示例:

案例一:

friends : []
Run Code Online (Sandbox Code Playgroud)

我和一个 12 岁的孩子莎拉添加了一个新朋友的名字“josh”,我得到:

friends : [{name:"josh",children:[{name:sarah,age:12}]}]
Run Code Online (Sandbox Code Playgroud)

太棒了。

Now i add a new friend name 2 with children tom 15.
Run Code Online (Sandbox Code Playgroud)

没发生什么事。

之后,我想给乔希添一个新孩子,提米15岁

我得到:

friends : [{name:"josh",children:[{name:timmy,age:12}]}]
Run Code Online (Sandbox Code Playgroud)

莎拉消失了。

zan*_*ngw 5

请尝试通过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();
Run Code Online (Sandbox Code Playgroud)