如果我理解正確,這在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聚合框架的例子。除此之外,手動過濾似乎是唯一可行的方法。
你能告訴我們一些樣本文檔這種情況下,你已經嘗試和預期結果的代碼? – chridam
@chridam完成。如果需要其他東西,請說。 –
@Saraiva'$ elemMatch'有限制,只返回匹配'$ elemMatch'條件的第一個元素,如果你運行這個查詢'{「attributes」:{「$ elemMatch」:{「tag」:「media」} },「attributes」:{「$ elemMatch」:{「tag」:「teste」}}},{「attributes。$。tag」:1}'只返回一個匹配數組而不是整個數組,所以如果你想找出所有匹配的數組,然後應該使用mongo聚合 – Yogesh