我想你必须使用aggregation framework。
类似的东西
db.test.aggregate( {$unwind:'$tags'},
{$match: {tags:{$in: ["house", "garden", "fish"]}}},
{$group: {_id:'$_id', tagcount:{$sum: 1}}} )
解释:
-
$unwind 部分为 tags 数组中的每个元素创建一个文档
-
$match 从那些文档中选择那些与列表中的标签匹配的文档
-
$groupgreates 一个按 _id 分组的文档并计算每个匹配的文档
结果应该是表单的文档列表
{_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 }