在子文档中添加值(嵌套在主文档中)而不重复 - MongoDB

时间:2015-03-31 03:46:20

标签: python arrays mongodb nested pymongo

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

总结一下,我想:

  1. 向数组添加值(不重复),并且该数组位于子文档中,该子文档位于主文档的数组中。 (Document> Array> Subdoc> Array)
  2. 子文档本身可能不存在,所以如果不存在,则需要添加子文档本身,即UpSert
  3. 两个操作的命令相同(即向subdoc的数组添加值,并添加subdoc)
  4. 我尝试了以下操作,但它不起作用:

    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']}
       ]
    }
    

    第一次:

    {
       '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']}
       ]
    }
    

1 个答案:

答案 0 :(得分:1)

我的理解是,您将无法直接完全实现预期的解决方案。您可以很好地执行嵌套updateupsert,但可能不会进行重复检查,因为没有直接检查数组文档中的项contains的方法。

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