2017-05-19 63 views
1

有这样的文件:蒙戈查询推对象嵌套集合

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

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

如果它小于特定更新时间(例如1300000000)和userId = 10 &&type = navi && elements.name = apple,我想更新updateTime。首先,我试图匹配元素并编写查询,但没有返回项目。

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

但是没有返回项目。任何人都可以帮助检查它为什么发生?

在此先感谢。


更新查询为@Samip Suwal说。


回答

1

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

  1. 您可以将此文档拆分为两个集合并使用references
  2. 您可以搜索文档(这可以完成),并且在java中,您可以使用java处理文档,然后保存。
+0

感谢您的建议,我拿第一个。 – Junjie

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,解决这个问题。

+0

非常感谢您通知我错字。 – Junjie