2014-01-19 80 views
3

的編號順序在數組包含的元素我有一個的MongoDB與期待,因爲這類文件的集合:查詢的MongoDB在匹配元素

{ 


_id: ObjectId("5222769532fed3037d000049"), 


cat_list: { "52226a8932fed36c3000007e": 1 }, 
feature_list: { 
    "52227433abb03fa34b0000fa": 0.2, 
    "52236117099c8924c500004a": 0.2, 
    "52236236c71890c199000054": 0.2, 
    "522374d2842e497d2c00000c": 0.2, 
    "52237e3b842e493760000021": 0.2 }, 
title: "blah" 

}

現在我基本上婉來查找文檔它們與提供給feature_list中的按鍵的一組按鍵相匹配。爲此,我想我會使用某種形式的$ in [,],儘管我不知道如何使用key:value列表來完成此操作。 (是不是一樣的嗎?)

其次,我想訂購由降頻的結果(如果我能做到這一點在MongoDB中,而不必做它在我的服務器端代碼)。所以,如果我查詢"52227433abb03fa34b0000fa" OR "52236117099c8924c500004a" OR "52236236c71890c199000054",我的結果集將包含所有具有含一種或多種那些在OR列表,並與最大量的比賽將是第一個文檔中的feature_list的文件,然後在頻率下一個和等等。

+0

只是爲了澄清:你想按字段名稱查找,而不是按值查找?例如,您是否必須返回完整的匹配文檔或僅僅是ID? –

回答

2

要查找所有這些文件與給定值的字段中的至少一個,你可以使用此查詢:

db.aggr.find({$or: [ 
{ "feature_list.52227433abb03fa34b0000fa" : { $exists: true } }, 
{ "feature_list.52236117099c8924c500004a" : { $exists: true } }, 
{ "feature_list.52236236c71890c199000054" : { $exists: true } } 
]}); 

其中找到您的文檔:

{ 
    "_id" : ObjectId("5222769532fed3037d000049"), 
    "cat_list" : { 
     "52226a8932fed36c3000007e" : 1 
    }, 
    "feature_list" : { 
     "52227433abb03fa34b0000fa" : 0.2, 
     "52236117099c8924c500004a" : 0.2, 
     "52236236c71890c199000054" : 0.2, 
     "522374d2842e497d2c00000c" : 0.2, 
     "52237e3b842e493760000021" : 0.2 
    }, 
    "title" : "blah" 
} 

但你不能真正按照你想要的方式排序,因爲沒有任何可排序的東西。我想通過這些搜索域進行排序的,如果你搜索一個字段,因爲丟失的領域將有lowest value它會工作。但是,在這種情況下,多個字段sort中的字段順序很重要,這個技巧不起作用。

什麼也不起作用正試圖通過整個子文檔進行排序,即.sort({"feature_list" : -1})因爲它沒有給出任何有意義的排序。

所以在這一點得到這些結果的唯一方式是使用聚合框架,多個查詢(3例),或做在你的代碼。

我敢肯定,我可以寫一個聚合框架查詢做到這一點,但首先你會被你可以裝在單個文件大小(32MB)結果的數量是有限的。如果你只返回ids,那會更好一點。其次,它可能實際上並不那麼高效。最後,您可能會考慮重新設計架構,因爲它是非常規的。這使得查詢變得困難和低效。

編輯

一個模式可以被重新設計,這樣的:

{ ..., 
    feature_list: [ 
    {fid: "52227433abb03fa34b0000fa", weight: 0.2}, 
    {fid: "52236117099c8924c500004a", weight: 0.2} 
    ] 
} 

這仍然沒有使用常規的查詢排序幫助,但是發現數據會快很多,因爲蒙戈不使用索引對於$exists,但將在這個新模式中使用索引(如果存在),其中字段變爲數據。沒有辦法在Mongo中按數組中匹配元素的數量進行排序。

您可以在一個非常類似的方式來使用聚合框架,而不是常規查詢的數據得到: In MongoDB search in an array and sort by number of matches 的問題是,你只能得到儘可能多的結果能適應與聚合框架一個文件內。爲了最大限度地利用它,您可以在最後步驟中僅投射文檔的_id。

替代使用聚合框架的方法是在找到結果後,在代碼中對數據進行排序。在任何一種情況下,由於索引,重新設計模式似乎都是有益的

+0

對於模式修訂,您有什麼建議?我試圖對我的數據建模,以便我可以將文檔與關聯權重「特徵」文檔關聯起來,就像在神經網絡中一樣。 – Lehel

+0

您是否認爲MapReduce將是一種排序的好方法? – Lehel

+0

這很難說。也許你可以在代碼中完成,或者使用map reduce。也許需要一些測試。地圖縮小可能涉及較少,但會將結果集大小限制爲16Mb。 –