2014-02-20 4 views
0

MongoDB에 새로운 기능이있어서 쿼리를 작성하려고합니다.정렬 기능이있는 pymongo의 MongoDB 쿼리

나는 예를 들어, 목록을 가지고 : 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가 ->가

+0

그럼, 당신의 문서가 [오름차순의 알파벳순]이되도록 mydatalist에서 결과를 정렬하고 싶습니까? –

+0

@NeilLunn 예를 들어 업데이트되었습니다. 제발 봐 – Tasos

+0

오케이. 그게 더 분명해. –

답변

2

그래서 당신은 일치의 숫자로 정렬 된 결과를 원하는 DATA3 배열을 선택하십시오. 아니 단순한 발견에 대한 것은 그러나 이것은 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 
} 

또한,이 것을 언급 아마 가치가있다 모든 최신 드라이버 버전에서 aggregatefind의 경우와 마찬가지로 커서를 반환합니다. 현재이 드라이버는 이고 드라이버는이지만 버전 2.6부터는 실제로 사용할 수 있습니다. 이로 인해 aggregate은 구현 된 호출에서 find에 대한 매우 유효한 "스왑 - 인 (swap-in)"대체 코드가됩니다.

+0

오 대단합니다. 지금까지 집계를 사용하지 않았지만 당신이 한 일을 이해할 수 있다고 생각합니다. 나는 다른 대답을 좀 더 기다릴 것이다. 내가 다른 것을 갖지 않으면 내가 너를 고를거야. – Tasos

+0

@AnastasiosVentouris Fine. 숨을 멈추지 마세요. 찾기를 사용하여 원하는 것은 불가능합니다. 유일한 다른 옵션은 mapReduce이지만, 그것은'aggregate'처럼 적합하지 않습니다. 아니면 빨리. –