我有一个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>', .. ] } })
但是,当然,这不会以相同的排序顺序返回集合,文档本身也没有任何内容可以依赖。
显然我的做法是错误的,但我无法想到解决方案。如何返回光标,其结果按照我计算的相关性排序?
请注意,我无法更新相关文档,因为多个用户需要同时进行搜索。
答案 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