2017-08-29 77 views
-2

假設有以下類型的MongoDB文檔;如何在MongoDB中通過對象數組進行搜索,評分和排序?

'標籤'

[ 
{ 
_id:1, 
name:[ 'C#', 'C#.NET', 'csharp' ] 
}, 
_id:2, 
name:[ '.NET', '.NET Framework', 'dotnet framework' ] 
}, 
_id:3, 
name:[ 'javascript', 'js' ] 
} 
] 

'帖子'

[ 
{ 
    _id: 1, 
    contributer: { first: 'XXX', last: '-' }, 
    tags: [ { name: 'C#', tag_id: '1' }, { name: '.NET Framework', tag_id: '2' } ] 
}, 
{ 
    _id: 2, 
    contributer: { first: 'YYY', last: '-' }, 
    tags: [ { name: 'javascript', tag_id: '3' } ] 
}, 
{ 
    _id: 3, 
    contributer: { first: 'XXX', last: '-' }, 
    tags: [ { name: '.NET Framework', tag_id: '2' } ] 
}] 

我想通過多個標籤,如搜索;

{ 
    _ids: [1 ,2 ] 
} 
其中有超過100多萬份文檔後文件

(而且還在不斷增加中)和結果排序有關irrelivant。

我正在尋找先進的解決方案,通過用現有的一個和其他解決方案(如map-reduce)和最佳搜索查詢替換更好的文檔結構以獲得緊固件結果。

預期的結果是;

'結果'

[ 
{ 
    _id: 1, 
    contributer: { first: 'XXX', last: '-' }, 
    tags: [ { name: 'C#', tag_id: '1' }, { name: '.NET Framework', tag_id: '2' } ] 
}, 
{ 
    _id: 3, 
    contributer: { first: 'XXX', last: '-' }, 
    tags: [ { name: '.NET Framework', tag_id: '2' } ] 
}] 

我試過下面的代碼片(多$ elemmatch)爲止;

db.posts.find(
    { 
     tags: { 
       $elemMatch: { 
        tag_id: "1", "2", 
       }, 
       $elemMatch: { 
        tag_id: "1", 
       }, 
     } 
    } 
) 

但不知道是否唯一和最好的解決方案。您可以包含MongoDB或C#驅動程序代碼。謝謝你的建議!

+0

到目前爲止您嘗試過什麼? –

+0

你好,我編輯了這個問題並添加了代碼片。謝謝。 – Ayberk

回答

1

這裏的關鍵是索引,我建議你花一些時間根據你正在搜索的內容來定義索引。我建議使用explain()方法查看查詢執行計劃並查看可以改進的內容。如果您的查詢在收集掃描中達到100%,則會非常慢。

不確定你是否已經完成了這個任務,但不能推薦MongoDB大學的.NET開發者的免費課程(https://university.mongodb.com/courses/M101N/about)。

+0

你好安德烈,謝謝你的回答。 tag_id上有一個定義的單個索引。我有M101N課程,而MongoDB有2.4版本,我有它的證書。 – Ayberk

+0

在標籤數組上添加新的索引可能很有用,這樣查詢就可以使用索引掃描 –

相關問題