Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 能否在Mongo中为$addToSet指定一个键?_Mongodb_Pymongo - Fatal编程技术网

Mongodb 能否在Mongo中为$addToSet指定一个键?

Mongodb 能否在Mongo中为$addToSet指定一个键?,mongodb,pymongo,Mongodb,Pymongo,我有一份文件: { 'profile_set' : [ { 'name' : 'nick', 'options' : 0 }, { 'name' : 'joe', 'options' : 2 }, { 'name' : 'burt', 'options' : 1 } ] } 如果名称不存在,则希望将新文档添加到profile\u集合集合(无论选项如何) 因此,在本例中,如果我尝试添加: {'name':'matt','options':0} 它应该添加它,但

我有一份文件:

{ 'profile_set' :
  [
    { 'name' : 'nick', 'options' : 0 },
    { 'name' : 'joe',  'options' : 2 },
    { 'name' : 'burt', 'options' : 1 }
  ] 
}
如果名称不存在,则希望将新文档添加到
profile\u集合
集合(无论选项如何)

因此,在本例中,如果我尝试添加:

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

它应该添加它,但是添加

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

不应执行任何操作,因为已存在名为
nick
的文档,即使
选项不同

Mongo似乎与整个元素相匹配,我以检查它是否相同而结束

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

是否有办法使用
$addToSet
执行此操作,或者我必须按另一个命令吗?

如果
配置文件集中已经存在
名称,则可以使用查询对象来限定
更新
。在外壳中:

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

因此,这将只对具有匹配的
\u id
的文档执行
$push
,如果没有
配置文件集
元素,其中
名称
'nick'
,从MongoDB 4.2开始,有一种方法可以使用

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

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" ]}} 
      }}
   ]}}}
])

由于您不能保证$addToSet将首先运行,因此如果我以后需要更改mick的名称,即更改现有数组对象,而不是添加新对象,则需要两个命令来执行此操作。有没有办法在一个原子更新操作中做到这一点,并且仍然遵守唯一的名称约束?关于更改profile_集中现有对象的后续问题:。无论我去哪里解决mongoose或mongo问题,@JohnnyHK总是救了我。@JohnnyHK如果我需要覆盖已经存在的值怎么办?请任何人回复上面的@Alex问题。如果元素已经存在,那么更新该元素需要什么?