2017-05-19 62 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