2016-11-23 112 views
0

我有包含_id文檔蒙戈DB收集,版本等衆多領域。我有ID的喜歡的數組:

["1A", "2b", "3C", "4D"] 

如果我想所有包含上述任何的id的文件,我可以查詢,如:

{ 
    _id : { 
     $in: ["1A", "2b", "3C", "4D"] 
     } 
} 

我想知道,如果我們能與除了另一個狀態到_id即具有條件上述陣列查詢,像下面:

{ 
     $in: [{"id":"1A","version":"1.1"},{"id":"2B","version":"2.1"},{"id":"3C","version":"3.1"},{"id":"4D","version":"4.1"}] 
     } 
} 

示例{「id」:「1A」,「version」:「1.1」}: 我希望所有具有id的文件爲1A版本爲1.1。對於數組中的所有對象也是如此。

+0

什麼是你的問題?請用更好的例子重寫問題。 – Saleem

+0

@Saleem對不起,缺少清晰度。我編輯了這個問題。希望現在可以理解。 – superUser

回答

2

你可以嘗試這樣的事情:

db.collection.find(
    { 
    //this OR will make sure that you get at any matching combination 
    $or:[ 
     {"<FIELD1>": "<VALUE1.1>", "<FIELD2>": "<VALUE1.2>"}, 
     {"<FIELD1>": "<VALUE2.1>", "<FIELD2>": "<VALUE2.2>"} 
    ] 
    } 
) 

以上文件$和可用here

還有一些其他運營商,以及像$或$不here

+0

感謝您的回答。這將分別查找ID和版本,並「和」他們。我的問題是,每個ID,即你的「FIELD1」有其特定的相應版本,即你的「FIELD2」。 – superUser

+0

謝謝你。這是對所有組合進行單個查詢的一個解決方案。我可以遍歷我的數組並構建這個查詢,但是我的問題是如果沒有「AND」每個組合(即在一個查詢中具有所有組合)有可能做到這一點。 – superUser

+0

更新了答案,我99%確定你會接受這個答案。開玩笑。 ;) –

1

您需要使用$elemMatch同時匹配的標準像

db.collection1.find(
    { arrayObjectKeyName: { $elemMatch: { id: "1A", version: "1.1" } } } 
) 

當然,這裏就是這樣

db.collection1.find({ "arrayObjectKeyName": {"$elemMatch":{"id": "1A","version":{"$in":["1.1","1.3","1.9876"]} }} }) 
+0

感謝您的回覆。但要做到這一點,我必須分別查詢每個「ID」。相反,我想能夠做一個單一的查詢,就像我爲「ID in」數組做的那樣。 – superUser

+0

@suzo,不,你可以使用'$ elemMatch'中的'$ in'運算符。 – Rahul

+0

的確如此,我只是想知道我們怎麼能做到這一點。你能幫我解決嗎? – superUser

1

顯示有兩個值例子的一個例子。你可以添加儘可能多的你需要的。使用$或$和$和操作符爲多個鍵。

find({ 
    "$or": [{ 
     "$and": [{ 
      "_id": "1A" 
     }, { 
      "version": "1.1" 
     }] 
    },{ 
     "$and": [{ 
      "_id": "2B" 
     }, { 
      "version": "2.1" 
     }] 
    }] 
}) 

更新到包括在對象陣列搜索。

樣品採集:

db.multikeys.insertMany([{ 
    _id: 1, 
    tags: [{ 
     _id: "1A", 
     version: "1.1" 
    }, { 
     _id: "2B", 
     version: "1.4" 
    }] 
}, { 
    _id: 2, 
    tags: [{ 
     _id: "2B", 
     version: "2.1" 
    }, { 
     _id: "3C", 
     version: "3.1" 
    }] 
}]) 

查詢:

db.multikeys.find({ 
    tags: { 
     $elemMatch: { 
      $or: [{ 
       _id: "2B", 
       version: "2.1" 
      }, { 
       _id: "1A", 
       version: "1.1" 
      }] 
     } 
    } 
}).pretty() 

樣本輸出:

{ 
    "_id": 1, 
    "tags": [{ 
     "_id": "1A", 
     "version": "1.1" 
    }, { 
     "_id": "2B", 
     "version": "1.4" 
    }] 
} { 
    "_id": 2, 
    "tags": [{ 
     "_id": "2B", 
     "version": "2.1" 
    }, { 
     "_id": "3C", 
     "version": "3.1" 
    }] 
} 
+0

當針對一系列物品發生過濾時,這將無法正常工作。試一試,看看你自己 – Rahul

+0

我知道。但OP沒有提及任何關於在數組中搜索的內容。我會等待OP確認並相應地進行更改。 – Veeram

+0

這不起作用。我有一個對象的數組,像在每個對象有一個id和版本的問題中提到的。我想檢查是否有任何文檔在每個對象中都滿足這兩個值。我只在該文檔與相應版本匹配時才需要該文檔。這與$ in相同,除了我有兩個值來檢查而不是一個。 – superUser