【问题标题】:Update Embedded Documents in array without Repeating in MongoDb using Java使用 Java 更新数组中的嵌入文档而不在 MongoDb 中重复
【发布时间】:2017-06-19 04:19:16
【问题描述】:

我的文档中有以下结构:

{
  "_id": 11111,
  "user": "user@mail.com",
  "sites": [
    {
      "sitename": "site1",
      "url": "site2.com",
      "keywords": [],
    },
    {
      "sitename": "site2",
      "url": "site2.com",
      "keywords": [],
    },
    {
      "sitename": "site2",
      "url": "site2.com",
      "keywords": [],
    },
  ]
},{
  "_id": 2222,
  "user": "user2@mail.com",
  "sites": []
}

我将通过 ID(id:11111) 查找文档。有多个文档。然后我想将新站点添加到包含 1111 _id 的文档中的站点数组。如果站点名称已经有,则站点不应添加。我怎样才能做到这一点?

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    类似

    db.collection.update({_id:11111, 'sites.sitename' : {$exists:false}},
     {$set : {'sites.$.sitename':'newsite.com'}},{multi:true})
    

    编辑

    如果您想为站点名称添加子文档

    var sub = {'a':'a','b':'b'};
    
    db.collection.update({_id:11111, 'sites.sitename' : {$exists:false}},
         {$set : {'sites.$.sitename':sub}},{multi:true})
    

    【讨论】:

    • 我想将嵌入文档添加到数组中。不仅仅是新闻网站
    【解决方案2】:

    更新答案:

    您可以检查_id 是否为“11111”,然后检查sitename 是否不存在且不等于新站点名称。然后就可以$push将嵌入的文档放入数组中了。

    db.collection.update(
     {
        _id:11111,
        'sites.sitename' : {$exists:false},
        'sites.sitename' : {$ne:'site4'}
     },
     {
        $push:
        {
            'sites': 
            {
                "sitename": "site4",
                "url": "site4.com",
                "keywords": []
            }
        }
     },
     {
        multi:true
     }
    )
    

    【讨论】:

    • 我想将新的站点嵌入文档添加到数组中。不仅仅是新闻网站
    • 我已根据您的要求更新了我的答案。请尝试一下。
    猜你喜欢
    • 2016-08-13
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2013-07-27
    相关资源
    最近更新 更多