2014-02-20 61 views
0

我是新的MongoDB,我想創建一個查詢。MongoDB查詢與pymongo排序功能

我有一個列表,例如:mylist = [a,b,c,d,e] 我的數據集有一個類似的列表中的一個關鍵:mydatalist = [b,d,g,e]

我想創建一個查詢,將返回所有包含來自MYLIST至少一個數據。

我做了什麼。

query = {'mydatalist': {'$in': mylist}} 
selector = {'_id':1,'name':1} 
mydata = collection.find(query,selector) 

這是完美的工作。我唯一想做的和我不能做的就是根據他們在mydatalist中擁有的mylist數據的數量對結果進行排序。有沒有辦法在查詢中做到這一點,或者我必須在光標後手動執行此操作?

更新一個例子:

mylist = [a,b,c,d,e,f,g] 

#data from collection 
data1[mydatalist] = [a,b,k,l] #2 items from mylist 
data2[mydatalist] = [b,c,d,e,m] #4items from mylist 
data3[mydatalist] = [a,u,i] #1 item from mylist 

所以,我想要的結果進行排序的數據2 - >數據1 - > DATA3

+0

所以你的問題是,你想排序在'mydatalist'結果爲您的文件按順序[按字母升序]? –

+0

@NeilLunn更新了一個例子。請看看 – Tasos

+0

好吧。這更清楚。 –

回答

2

所以,你想匹配的數量排序的結果到你的陣列選擇。不是爲找一個簡單的事情,但是這可以通過aggregation framework來完成:

db.collection.aggregate([ 
    // Match your selection to minimise the 
    {$match: {list: {$in: ['a','b','c','d','e','f','g']}}}, 

    // Projection trick, keep the original document 
    {$project: {_id: {_id: "$_id", list: "$list" }, list: 1}}, 

    // Unwind the array 
    {$unwind: "$list"}, 

    // Match only the elements you want 
    {$match: {list: {$in: ['a','b','c','d','e','f','g']}}}, 

    // Sum up the count of matches 
    {$group: {_id: "$_id", count: {$sum: 1}}}, 

    // Order by count descending 
    {$sort: {count: -1 }}, 

    // Clean up the response, however you want 
    {$project: { _id: 0, _id: "$_id._id", list: "$_id.list", count: 1 }} 
]) 

有你有順序的文件,你想:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("5305bc2dff79d25620079105"), 
      "count" : 4, 
      "list" : ["b","c","d","e","m"] 
     }, 
     { 
      "_id" : ObjectId("5305bbfbff79d25620079104"), 
      "count" : 2, 
      "list" : ["a","b","k","l"] 
     }, 
     { 
      "_id" : ObjectId("5305bc41ff79d25620079106"), 
      "count" : 1, 
      "list" : ["a","u","i"] 
     } 
    ], 
    "ok" : 1 
} 

而且,它可能是值得一提的是,在最近的所有驅動程序版本中,aggregate將返回一個光標,就像find一樣。目前這是驅動程序模擬模擬,但從2.6版本開始,它確實是真實的。這使aggregate成爲您實施的呼叫中find的非常有效的「換入」替換。

+0

哦,太棒了。直到現在我還沒有使用聚合,但我認爲我能理解你做了什麼。我會等待更多的其他答案。如果我什麼都沒有,我會選擇你的。 – Tasos

+0

@AnastasiosVentouris很好。不要屏住呼吸,你想要什麼是不可能使用查找。唯一的其他選擇是mapReduce,但這不適合'aggregate'。或者一樣快。 –