MongoDB:在数组中查找最佳匹配[Mongoose]

时间:2016-12-26 08:29:08

标签: mongodb mongoose mongodb-query

以下是人员数据库:

[
  #1 {qualities: ['brown', 'nice', 'happy' 'cool' 'cheery']}
  #2 {qualities: ['blue', 'okay', 'happy' 'decent' 'cheery']}
  #3 {qualities: ['green', 'alright', 'happy' 'cool' 'cheery']}
]

以下是人员架构和模型:

var peopleSchema = mongoose.Schema({
  qualities: [],
});

var People = mongoose.model('People', peopleSchema);

以下是实际工作的查询:

People.find({'qualities': "cheery"}, function(err, people) {
   console.log(people)
});

^^问题:不能使用多个单词。 ^^

以下是我想的查询类型:

People.find({'qualities': ["brown", "happy", "cool"]}, function(err, persons) {
  console.log(persons)
});

有希望的结果将是#1号人员,其次是#3号人员,其次是#2号人员。

1 个答案:

答案 0 :(得分:3)

您可以使用$in运算符

{ field: { $in: [<value1>, <value2>, ... <valueN> ] } } 

所以查询可以像

People.find({'qualities': {$in: ["brown", "happy", "cool"]}}, function(err, persons) {
  console.log(persons)
});

如果您想首先根据最大匹配文档获取数据,则需要使用聚合查询

说你的数据如:

{_id:1, qualities: ['brown', 'nice', 'happy' 'cool' 'cheery']}
{_id:2, qualities: ['blue', 'okay', 'happy' 'decent' 'cheery']}
{_id:3, qualities: ['green', 'alright', 'happy' 'cool' 'cheery']}

然后你的查询就像

People.aggregate([
  {$unwind:"$qualities"},
  {$match:{'qualities': {$in: ["brown", "happy", "cool"]}}},
  {$group:{_id:"$_id",count:{$sum:1}}},
  {$sort:{count:-1}}
]).exec(function(err, persons) {
      console.log(persons)
});

它将返回 1,3,2 ,因为第一个 3 相匹配  商品,第三个 2 商品匹配,第二个 1 商品相匹配