所以,我会向我的api发送以下数组格式
['apple', 'orange', 'mango', 'kiwi', 'lemon']
在我的数据库中,我有一个名为Recipes
的集合,其格式为
ingredients: [ {
..,
name: 'apple',
..
}, {
..,
name: 'orange',
..
}]
- 是具有这种格式的对象数组
在我的数据库中包含以下文件:
文件#1
ingredients:[
{.., name: 'apple', ..},
{.., name: 'kiwi', ..},
{.., name: 'banana', ..}]
文件#2
ingredients:[
{.., name: 'apple', ..},
{.., name: 'orange', ..},
{.., name: 'kiwi', ..}]
文件#3
ingredients:[
{.., name: 'lemon', ..},
{.., name: 'tomato', ..},
{.., name: 'potato', ..}]
mongoose查询应该如何返回文档#2,文档#1,文档#3(此顺序,因为它们的数组与初始请求的数组最相似)
答案 0 :(得分:0)
您可以使用以下聚合:
db.collection.aggregate([
{
$addFields: {
totalMatch: {
$size: {
$setIntersection: [['apple', 'orange', 'mango', 'kiwi', 'lemon'], { $map: { input: "$ingredients", as: "ingredient", in: "$$ingredient.name" } }]
}
}
}
},
{
$sort: {
totalMatch: -1
}
},
{
$project: {
totalMatch: 0
}
}
])
您只需要添加其他字段,该字段计算所有匹配的成分(使用$setIntersection),然后按该字段按降序排序。由于您的成分包含对象,因此您可以使用$map仅检索名称。