2015-09-15 42 views
0

我有兩個對象:

{ 
    genre: ['music', 'movie'] 
} 

{ 
genre: ['movie', 'music'] 
} 

和我的查詢是:

db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}}) 

,它只是給了我第二個對象。爲什麼?我想要獲取所有包含數組中特定流派的文檔,而不管數組中的哪個位置。我怎樣才能做到這一點?

+2

基本上使用'db.test.find({ 「流派」: 「$在」{: 「電影」]}})'或實際上只是'分貝。除非需要數組子文檔中的多個屬性以符合條件,否則不需要'$ elemMatch'作爲test.find({「genre」:「movie」})''。當然你不知道。 '$ in'也不是。僅僅因爲內容在「數組」中並不意味着您需要使用一個運算符,該運算符使用數組作爲參數或檢查單個值測試。 –

+0

不基於您在這裏給出的數據。任何一種查詢形式都沒有問題(只是除了第二個例子之外,做任何事情都是多餘的)。所以,如果你不匹配,那麼你還沒有在這裏告訴我們其他的原因。 –

+0

它現在有效,太棒了!謝謝 :) –

回答

0

在這種情況下,您既不需要$elemMatch也不需要$in。一個簡單的field:value將匹配其中field是一個數組並且該數組中的任何一個值爲value的文檔。這意味着

db.test.find({genre :'movie'}); 

就足夠了。

數組查詢操作符在更復雜的情況下是必需的。當你有可能值的列表,並希望在那裏它們中的任何發現文件(這樣db.test.find({genre : { $in:['movie']} });會的工作,但將是不必要的令人費解)

  • $all作品就像在$而是需要需要

    • $in全部提供的元素在陣列中
    • $elemMatch有點複雜。當您要使用多個操作員條件(如$ gt或$ lt)時需要此選項,但只需要一個數組條目匹配全部條件的文檔。如果沒有$ elemMatch運算符,您將得到每個條件至少由一個數組條目滿足的結果,但不一定全部使用同一條目。
  • 0

    記住db.test.find()通常會返回遊標對象。您可以通過以下方式訪問所有的文檔:

    entry = db.test.find({genre :{ $elemMatch:{ $in : ['movie']}}}) 
    for doc in entry: 
        print(doc) 
    
    相關問題