按不在数组中的值的数量对Mongoose / MongoDB查询结果进行排序

时间:2015-12-05 23:10:47

标签: mongodb mongoose

我有两个带有以下简化模式的集合:

// 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
}

是否可以单独使用查询来执行此操作?

1 个答案:

答案 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 }