10

配列内に3つ以上の一致する値を持つ複数のドキュメントを検索できるようにしたい。次のドキュメントがあるとしましょう。

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

そして、次の配列で(車の)値が少なくとも3つあるドキュメントを検索します。

   [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 に答える