簡體   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