2014-02-20 60 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'。或者一样快。 –