我有兩個對象:
{
genre: ['music', 'movie']
}
和
{
genre: ['movie', 'music']
}
和我的查詢是:
db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}})
,它只是給了我第二個對象。爲什麼?我想要獲取所有包含數組中特定流派的文檔,而不管數組中的哪個位置。我怎樣才能做到這一點?
我有兩個對象:
{
genre: ['music', 'movie']
}
和
{
genre: ['movie', 'music']
}
和我的查詢是:
db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}})
,它只是給了我第二個對象。爲什麼?我想要獲取所有包含數組中特定流派的文檔,而不管數組中的哪個位置。我怎樣才能做到這一點?
在這種情況下,您既不需要$elemMatch
也不需要$in
。一個簡單的field:value
將匹配其中field
是一個數組並且該數組中的任何一個值爲value
的文檔。這意味着
db.test.find({genre :'movie'});
就足夠了。
數組查詢操作符在更復雜的情況下是必需的。當你有可能值的列表,並希望在那裏它們中的任何發現文件(這樣db.test.find({genre : { $in:['movie']} });
會的工作,但將是不必要的令人費解)
$all
作品就像在$而是需要需要
$in
全部提供的元素在陣列中$elemMatch
有點複雜。當您要使用多個操作員條件(如$ gt或$ lt)時需要此選項,但只需要一個數組條目匹配全部條件的文檔。如果沒有$ elemMatch運算符,您將得到每個條件至少由一個數組條目滿足的結果,但不一定全部使用同一條目。記住db.test.find()通常會返回遊標對象。您可以通過以下方式訪問所有的文檔:
entry = db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}})
for doc in entry:
print(doc)
基本上使用'db.test.find({ 「流派」: 「$在」{: 「電影」]}})'或實際上只是'分貝。除非需要數組子文檔中的多個屬性以符合條件,否則不需要'$ elemMatch'作爲test.find({「genre」:「movie」})''。當然你不知道。 '$ in'也不是。僅僅因爲內容在「數組」中並不意味着您需要使用一個運算符,該運算符使用數組作爲參數或檢查單個值測試。 –
不基於您在這裏給出的數據。任何一種查詢形式都沒有問題(只是除了第二個例子之外,做任何事情都是多餘的)。所以,如果你不匹配,那麼你還沒有在這裏告訴我們其他的原因。 –
它現在有效,太棒了!謝謝 :) –