我有两个带有以下简化模式的集合:
// Ingredient
{
_id: Number
}
// Recipe
{
_id: Number,
ingredients: [{
type: Number,
ref: 'Ingredient'
}]
}
我正在试图找出如何根据您可用的成分实现食谱的搜索查询,并按每个食谱中缺少的成分数量进行排序。
例如,如果我有以下数据:
// Ingredients
{
_id: 1
},
{
_id: 2
},
{
_id: 3
},
{
_id: 4
},
{
_id: 5
}
// Recipes
{
_id: 1,
ingredients: [1, 2, 5]
},
{
_id: 2,
ingredients: [2, 4]
},
{
_id: 3,
ingredients: [2, 3]
}
我输入成分2和3,预期结果将是
{
_id: 3,
ingredients: [2, 3] // Missing 0 ingredients
},
{
_id: 2,
ingredients: [2, 4] // Missing 1 ingredient
},
{
_id: 1,
ingredients: [1, 2, 5] // Missing 2 ingredients
}
是否可以单独使用查询来执行此操作?
答案 0 :(得分:1)
您可以使用$setDifference
找到缺失的成分,然后$size
来计算您可以$sort
开启的数据。
var ingredients = [2, 3];
db.recipes.aggregate([
{$project: {missing: {$setDifference: ['$ingredients', ingredients]}}},
{$project: {missing: 1, numMissing: {$size: '$missing'}}},
{$sort: {numMissing: 1}}
])
结果:
{ "_id" : 3, "missing" : [ ], "numMissing" : 0 }
{ "_id" : 2, "missing" : [ 4 ], "numMissing" : 1 }
{ "_id" : 1, "missing" : [ 1, 5 ], "numMissing" : 2 }