我有这样一个文档
{
"text": "test description",
"tags": ["house", "garden", "wall"]
}
现在,如果我想在 MongoDB 中匹配多个标签,我会这样做
db.test.find( { tags: { $in: [ "house", "garden", "fish" ] } } );
有没有一种方法可以获取每个文档的匹配标签数量(比如在文本搜索中使用 $meta: "textScore") 这样我就可以按降序对文档与我的查询的匹配程度进行排序?
对于我上面的例子,我想知道有 2 个匹配的标签。
最佳答案
您将不得不使用 aggregation framework我认为。
像这样
db.test.aggregate( {$unwind:'$tags'},
{$match: {tags:{$in: ["house", "garden", "fish"]}}},
{$group: {_id:'$_id', tagcount:{$sum: 1}}} )
解释:
结果应该是表单的文档列表
{_id: id, tagcount: #matching tags}
您还可以添加 sort最后喜欢
{$sort:{tagcount : -1}}
因此,对您的结构进行聚合查询以返回 _id、文本、匹配标签和匹配标签的数量,这些标签按匹配标签的数量降序排列:
db.test.aggregate( {$unwind:'$tags'},
{$match: {tags:{$in: ["house", "garden", "fish"]}}},
{$group: {_id: '$_id' , text : {$first:'$text'},
tags:{$addToSet:'$tags'}, tagcount:{$sum: 1}}},
{$sort:{tagcount:-1}})
示例文档的结果
{ "_id" : ObjectId("5..."),
"text" : "test description",
"tags" : [ "garden", "house" ],
"tagcount" : 2 }
关于json - 计算数组中多个项目的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451914/