对没有字段的Mongo查询进行排序以进行排序

时间:2014-11-26 08:11:41

标签: mongodb aggregation-framework

我有一个Mongo集合,其中包含一系列搜索术语,例如:

[ "germany", "austria", "peter" ]

使用John Page I在excellent article底部描述的技术实现了一个Mongo聚合,它采用了搜索术语列表(例如"德国peter bob")并返回结果set,其中包括与每个文档匹配的术语数(并非所有术语都必须匹配)。在这个例子中:

{ "_id": "<id>", "c": 2 }

我已根据匹配项的数量对此聚合的结果进行了排序,因此最相关的ID是第一个。我最终得到了这样一个数组:

[ '<id1>', '<id2>', .. ]

现在我有一个按相关性排序的匹配ID列表,我需要在数据库中查询这些文档:

doc.find({ "_id": { $in: [ '<id1>', '<id2>', .. ] } })

但是,当然,这不会以相同的排序顺序返回集合,文档本身也没有任何内容可以依赖。

显然我的做法是错误的,但我无法想到解决方案。如何返回光标,其结果按照我计算的相关性排序?

请注意,我无法更新相关文档,因为多个用户需要同时进行搜索。

1 个答案:

答案 0 :(得分:1)

所以从链接中我猜你做了类似

的事情
aggregate([{$unwind : "$c"},
           {$match: {c :{$in : ["searchterms"]},
           {$group : {"c" : {"$sum" : 1},  _id : "$_id"}}])

其中c是您的搜索字词。

下一步是使用

按照c进行排序
{$sort: {c:-1}}

在你的聚合管道中。

现在您需要做的就是检索整个文档而不仅仅是_id。这可以通过以下方式修改聚合来完成:

aggregate([{$project: {_id:1,c:1,doc:"$$ROOT"}},
           {$unwind : "$c"},
           {$match: {c :{$in : ["searchterms"]},
           {$group : {"c" : {"$sum" : 1},  _id : "$_id",doc:{$addToSet:"$doc"}}},
           {$sort:{c:-1}}])

项目创建包含_id,searchterm数组和包含原始文档的字段doc的文档,该文档位于$group阶段。

这应该产生表格

的结果
{_id : <id> , c: <# of matching therms>, doc: [<the original document>]}

如果您只需要有限数量的文档,则可以使用$skip$limit