mongo查询将对象推送到嵌套集合

时间:2017-05-19 11:55:28

标签: java mongodb mongodb-query

有一个这样的文件:

{ 
    "_id" : ObjectId("591ec6ca277b295fa98a772b"), 
    "userId" : 10, 
    "appPrefs" : [ 
        { 
            "type" : "navi", 
            "elements" : [ 
                { 
                    "name" : "apple", 
                    "value" : "", 
                    "updateTime" : NumberLong(1222222222)                        
                }, 
                { 
                    "name" : "banana", 
                    "value" : "", 
                    "updateTime" : NumberLong(1222222222)                        
                } 
            ] 
        } 
    ] 
}

您可能会发现elements是一个集合并嵌入到另一个集合appPrefs中。

如果updateTime小于特定更新时间(例如1300000000)和userId = 10 &&type = navi && elements.name = apple,我想更新db.cname.find({"userId" : 10, "appPrefs":{$elemMatch: {type : "navi", "elements": {$elemMatch: {name : "apple"}}}}}) 。首先,我尝试匹配元素并编写查询,但没有返回任何项目。

AND

但没有退回任何物品。任何人都可以帮助检查它为什么会发生?

提前致谢。

更新查询@Samip Suwal说。

2 个答案:

答案 0 :(得分:2)

在您提供的查询中,我看到字段"元素"的拼写错误。你有" elemments"而不是"元素" 如此改变

db.cname.find({"userId" : 10, "appPrefs":{$elemMatch: {type : "navi", "elemments": {$elemMatch: {name : "apple"}}}}})

db.cname.find({"userId" : 10, "appPrefs":{$elemMatch: {type : "navi", "elements": {$elemMatch: {name : "apple"}}}}})

应该给你一个匹配。

对于更新部分。 我不认为现在有两个更新mongodb中多个嵌套数组中的元素。这是一个jira请求jira-831,请求解决此问题。

此外,如果有多个元素与查询匹配,我相信mongodb也不支持对数组中所有匹配项进行更新。这是一个jira请求,jira-1243,解决了这个问题。

答案 1 :(得分:1)

你不能这样做,因为这是Mongodb的当前限制。在这里,您尝试更新嵌套数组中的元素。当我们需要更新数组中的元素时,$用于保持位置。但它只支持一个级别。在这里有两个级别。您可以参考this了解更多详情。 但是你有两种选择。

  1. 您可以将此文档拆分为两个集合,然后使用references
  2. 您可以搜索文档(这可以完成),在java中,您可以在java中操作文档,然后保存。
相关问题