2013-03-08 26 views
8

3つ以上の一致する値を持つ複数の文書を配列内で見つけることができます。 MongoDB - 配列内の複数の値を一致させる

[{ 
     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] 
    }] 

誰でもこれを達成する方法は分かりますか?

+0

+1いいですね。私も時間のためにこれを疑問に思っていた:) –

答えて

7

これは良い質問です。私は、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; 
} }); 
11

あなたは$inクエリが発行され、その後の3つの以上のエントリを持つレコードをコードフィルタで持つことができます目的の配列。 (ここにいくつかのsamleの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 
+1

これは本当の答えです –

関連する問題