2015-04-23 227 views
0

如果我理解正確,這在mongodb中稱爲projection。我已經看到有兩種有用的預測算子:elemMatch$在mongodb查詢後過濾返回的數組中的元素

我有一組文件,每個文件都有一個屬性列表(對象)。我想執行復雜的查詢來匹配這些屬性,即匹配其中的幾個字段(使用regex等)。

當文檔匹配查詢時,Java驅動程序正在返回整個文檔。我想過濾它只返回匹配原始查詢的屬性。

我嘗試過將elemMatch結合起來,但我所能完成的只是返回所有屬性或只返回一個(通常是第一次匹配)。

蒙戈文檔結構如下:

{ 
    "name": "MediaPlayer", 
    "attributes": [ 
     { 
      "tag": "media", 
      "values": [ 
       "mp3", 
       "mp4" 
      ] 
     }, 
     { 
      "tag": "teste", 
      "values": [ 
       "teste" 
      ] 
     } 
    ] 
} 

和我的查詢爲:

{attributes : {$elemMatch: { 'tag' : 'media'},$elemMatch: { 'tag' : 'stream'}}} 

並返回結果如下:

{ 
    "name": "MediaStream", 
    "attributes": [ 
     { 
      "tag": "media", 
      "values": [ 
       "Edit" 
      ] 
     }, 
     { 
      "tag": "stream", 
      "values": [ 
       "Edit" 
      ] 
     }, 
     { 
      "tag": "video", 
      "values": [ 
       "Edit" 
      ] 
     } 
    ] 
} 

的例子,返回不同的文檔。雖然我匹配了two屬性,但我得到了返回的整個列表。

我希望屬性數組只包含匹配的元素。

我該如何做到這一點?

編輯:

從我所看到的MongoDB的發現操作不支持內部數組過濾。有一些使用mongodb聚合框架的例子。除此之外,手動過濾似乎是唯一可行的方法。

+0

你能告訴我們一些樣本文檔這種情況下,你已經嘗試和預期結果的代碼? – chridam

+0

@chridam完成。如果需要其他東西,請說。 –

+1

@Saraiva'$ elemMatch'有限制,只返回匹配'$ elemMatch'條件的第一個元素,如果你運行這個查詢'{「attributes」:{「$ elemMatch」:{「tag」:「media」} },「attributes」:{「$ elemMatch」:{「tag」:「teste」}}},{「attributes。$。tag」:1}'只返回一個匹配數組而不是整個數組,所以如果你想找出所有匹配的數組,然後應該使用mongo聚合 – Yogesh

回答

1

讓我們假設你想匹配tag:mediatag:stream,你進入了mongo $in聚集查詢您的匹配標準如下

db.collectionName.aggregate({ 
"$unwind": "$attributes" // first unwind attributes array 
}, { 
"$match": { 
    "attributes.tag": { 
    "$in": ["media", "stream"] // put all matching tags in array using $in 
    } 
} 
}, { 
"$group": { 
    "_id": "$_id", 
    "name": { 
    "$first": "$name" 
    }, 
    "attributes": { 
    "$push": "$attributes" // push all attributes to get only matching tags 
    } 
} 
}).pretty() 
+0

非常感謝您的幫助。我意識到我必須限制查詢輸入並做類似的事情。後期更新與完整的解決方案和描述。 –

1

發現了一個可能的解決方案:Solution A

編輯:聚集發現並不能證明,提供解決問題的一般解決方案,因爲我沒有控制查詢。從這個意義上講,如果我想展開屬性,然後將其與查詢進行匹配,那麼它將只適用於匹配單個屬性的查詢。

+1

根據我的理解,我認爲你想匹配兩個標籤,像'tag:media'和'tag:stream'一樣放鬆嗎?你不能寫聚合查詢嗎? – Yogesh

+0

@yogesh從一個未知的查詢(不是由我創建的)我想,如果一個文檔匹配,知道哪些註冊的屬性給了一個積極的匹配。例如,如果我有一個具有10個屬性和查詢匹配7的文檔。我希望查詢返回完整的文檔,只有7個匹配的屬性。因此,這是一個過濾數組的情況。 –