10

我希望能够在一个数组中找到具有三个或更多匹配值的多个文档。假设我们有以下文件:

   [{
       name: 'John',
       cars: [1, 2, 3, 4]
   },
   {
       name: 'Jane',
       cars: [1, 2, 3, 8]
   },
   {
       name: 'Smith',
       cars: [1, 8, 10]
   }]

我们希望在以下数组中找到至少具有三个值(在汽车中)的文档:

   [1, 2, 3, 4, 5, 6, 7]

结果将是:

   [{
       name: 'John',
       cars: [1, 2, 3, 4]
   },
   {
       name: 'Jane',
       cars: [1, 2, 3, 8]
   }]

任何人都知道如何实现这一目标?

4

4 回答 4

14

您可以$in发出查询,然后通过代码过滤在所需数组中具有 3 个或更多条目的记录。(这里是一些示例 python 代码)

def dennisQuestion():
    permissibleCars = [1,2,3,4,5,6,7]
    cursor = db.collection.find({"cars": {"$in": permissibleCars}})
    for record in cursor:
       if len(set(permissible) & set(record["cars"]))) >= 3
          yield record
于 2013-03-09T09:50:11.583 回答
11

这是一个很好的问题,我认为使用 MongoDB 为您提供的常用运算符没有简单的方法。但是我可以想到以下方法来实现这一点:

1. 新领域

在应用程序代码中计算它并将结果保存在文档的新字段中。

2.蛮力

db.Collection.find( { $or: [
    { cars: $all [ 1, 2, 3 ] },
    { cars: $all [ 2, 3, 4 ] },
    ... list out all 35 combinations
] } )

3.使用$where

db.Collection.find( { cars: { $in: [1,2,3,4,5,6,7] }, $where: function() {
    var numMatches = 0;
    for (var i = 1; i <= 7; i++)
        if (this.cars.indexOf(i) > -1) numMatches++;
    return numMatches >= 3;
} } );
于 2013-03-09T01:01:07.380 回答
0

当 Mongo 4.0.3 中的字符串值时,我不得不稍微修改 @Zaid Masud 选项 3:

db.Collection.find( { cars: { $in: ["s1", "s2", "s3" , "s4", "s5" , "s6" , "s7"] },
    $where: function() {
        var options = ["s1", "s2", "s3" , "s4", "s5" , "s6" , "s7"];
        var numMatches = 0;
        for (var i = 0; i < 7; i++)
            if (this.cars.indexOf(options[i]) > -1) 
                numMatches++;
        return numMatches >= 3;
    } 
} );

(这对于评论来说似乎有点大)

于 2019-07-19T18:42:54.973 回答
0

对于 Mongo v4.4.1,此查询有效

[
  {
    $project: {
      name: 1,
      cars: 1,
      show: {
        $let: {
          vars: {
            "b": {
              $gte: [{$size: {$setIntersection: [ [1,2,3,4,5,6,7],"$cars"]}},3]
            }
          },
          in: "$$b"
        }
      }
    }
  },
  {
    $match: {
      show: true,
      
    }
  },
  {
    $project: {
      show: 0
    }
  }
]
于 2020-10-10T20:25:01.373 回答