2014-01-24 79 views
0

我有一個對象數組,我想在MongoDB集合中查詢包含與我的對象數組中的任何對象匹配的元素的文檔。Mongo DB:按匹配數排序

例如:

var objects = ["52d58496e0dca1c710d9bfdd", "52d58da5e0dca1c710d9bfde", "52d91cd69188818e3964917b"]; 

db.scook.recipes.find({products: { $in: objects }} 

不過,我想知道我是否可以通過MongoDB中匹配的數量對結果進行排序。

例如,頂部將是具有恰好三個元素匹配的「配方」:["52d58496e0dca1c710d9bfdd", "52d58da5e0dca1c710d9bfde", "52d91cd69188818e3964917b"]

第二選擇有兩個食譜:即["52d58496e0dca1c710d9bfdd", "52d58da5e0dca1c710d9bfde"],而第三個只有一個:即["52d58496e0dca1c710d9bfdd"]

這將是巨大的,如果你能得到的項目它有數量。

+0

我想你在這裏有三個選擇:MongoDB Aggregation Framework,MongoDB Map-Reduce和操縱你的服務器中的數據。如果我有時間,我會試着用一個例子來回答。 – EmptyArsenal

回答

0

通過使用聚合框架,我認爲你應該能夠通過下面的MongoDB查詢獲得你需要的東西。但是,如果您使用的是Mongoose,則必須將其轉換爲Mongoose查詢。我不確定這個功能會如何運作,所以你可能需要一點努力才能使它正確無誤。此外,此答案取決於您是否可以使用$project運算符中的$or運算符,並且它將返回true。如果這不起作用,我認爲你需要使用map-reduce來獲得你需要的或者做到服務器端。

db.recipes.aggregate(
    // look for matches 
    { $match : { products : { $or : objects }}}, 
    // break apart documents to by the products subdocuments 
    { $unwind : "$products" }, 
    // search for matches in the sub documents and add productMatch if a match is found 
    { $project : { 
     desiredField1 : 1, 
     desiredField2 : 1, 
     products : 1, 
     // this may not be a valid comparison, but should hopefully 
     // be true or 1 if there is a match 
     productMatch : { "$products" : { $or : objects }} 
    }}, 
    // group the unwound documents back together by _id 
    { $group : { 
     _id : "$_id", 
     products : { $push : "$products" }, 
     // count the matched objects 
     numMatches : { $sum : "$productMatch" }, 
     // increment by 1 for each product 
     numProducts : { $sum : 1 } 
    }}, 
    // sort by descending order by numMatches 
    { $sort : { numMatches : -1 }} 
)