81

我有一个文件:

{ 'profile_set' :
  [
    { 'name' : 'nick', 'options' : 0 },
    { 'name' : 'joe',  'options' : 2 },
    { 'name' : 'burt', 'options' : 1 }
  ] 
}

profile_set如果名称尚不存在(无论选项如何),并希望将新文档添加到集合中。

所以在这个例子中,如果我尝试添加:

{'name' : 'matt', 'options' : 0}

它应该添加它,但添加

{'name' : 'nick', 'options' : 2}

不应该做任何事情,因为一个文件已经存在,名称不同,nick即使option是不同的。

Mongo 似乎与整个元素匹配,我最终检查它是否相同,我最终得到

profile_set containing [{'name' : 'nick', 'options' : 0}, {'name' : 'nick', 'options' : 2}]

有没有办法做到这一点,$addToSet或者我必须推送另一个命令?

4

2 回答 2

106

您可以update使用阻止更新的查询对象限定您nameprofile_set. 在外壳中:

db.coll.update(
    {_id: id, 'profile_set.name': {$ne: 'nick'}}, 
    {$push: {profile_set: {'name': 'nick', 'options': 2}}})

因此,这只会对$push具有匹配项_id且没有where isprofile_set元素的文档执行。name'nick'

于 2013-01-25T18:40:24.287 回答
10

从 MongoDB 4.2 开始,有一种方法可以使用update 中的聚合表达式来做到这一点。

对于您的示例案例,您可以这样做:

newSubDocs = [ {'name' : 'matt', 'options' : 0}, {'name' : 'nick', 'options' : 2} ];
db.coll.update( { _id:1 },
[ 
   {$set:  { profile_set:  {$concatArrays: [ 
      "$profile_set",  
      {$filter: {
             input:newSubDocs, 
             cond: {$not: {$in: [ "$$this.name", "$profile_set.name" ]}} 
      }}
   ]}}}
])
于 2020-12-02T16:46:46.463 回答