繁体   English   中英

在不重复的情况下将值添加到子文档中的数组(嵌套在主文档中)-MongoDB

[英]Adding value to array in sub-document (nested within main doc) without duplication - MongoDB

嵌套文档非常复杂,但是请告诉我是否有任何解决方案,谢谢。

总结一下,我想:

  1. 向数组添加一个值(不重复),该数组位于子文档内,即在主文档数组内。 (文档>数组>子文档>数组)
  2. 子文档本身可能不存在,因此,如果不存在,则需要添加子文档本身,即UpSert
  3. 这两个操作的命令是相同的(即,将值添加到子文档的数组,以及添加子文档)

我已经尝试了以下方法,但是不起作用:

key = {'username':'user1'}

update1 = {
'$addToSet':{'clients':{
 '$set':{'fname':'Jessica'},
 '$set':{'lname':'Royce'},
 '$addToSet':{'cars':'Toyota'}
  }
 }
}
#the document with 'Jessica' and 'Royce' does not exist in clients array, so a new document should be created
update2 = {
'$addToSet':{'clients':{
 '$set':{'fname':'Jessica'},
 '$set':{'lname':'Royce'},
 '$addToSet':{'cars':'Honda'}
  }
 }
}
#now that the document with 'Jessica' and 'Royce' already exist in clients array, only the value of 'Honda' should be added to the cars array

mongo_collection.update(key, update1 , upsert=True)
mongo_collection.update(key, update2 , upsert=True)

错误消息:$ set对于存储无效

我的预期结果:

之前:

{
   'username':'user1',
   'clients':[
   {'fname':'John',
    'lname':'Baker',
    'cars':['Merc','Ferrari']}
   ]
}

第1次之后:

{
   'username':'user1',
   'clients':[
   {'fname':'John',
    'lname':'Baker',
    'cars':['Merc','Ferrari']},
   {'fname':'Jessica',
    'lname':'Royce',
    'cars':['Toyota']}
   ]
}

第二个之后:

{
   'username':'user1',
   'clients':[
   {'fname':'John',
    'lname':'Baker',
    'cars':['Merc','Ferrari']},
   {'fname':'Jessica',
    'lname':'Royce',
    'cars':['Toyota','Honda']}
   ]
}

我的理解是,您将无法直接完全实现预期的解决方案。 可以很好地做到嵌套的updateupsert而重复检查可能不会,因为没有直接的方法来检查项目contains一个数组文件内。

对于upsert操作,您可以参考mongodb更新操作文档或批量操作。 对于重复,您可能需要使用单独的逻辑来识别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM