1

ここに私のコレクションのいくつかのレコードがあります:

{ id: 1, arrayA: [1, 2, 3], arrayB: [4, 5, 6]},
{ id: 2, arrayA: [2, 4], arrayB: [1, 5]},
{ id: 3, arrayA: [1, 6], arrayB: [2, 3, 4]},
{ id: 4, arrayA: [2, 6], arrayB: [1, 3, 4]},
{ id: 5, arrayA: [1, 4, 5], arrayB: [2, 3, 6]},
{ id: 6, arrayA: [2, 4, 5], arrayB: [2, 3]}
....

数値の配列 (inputArray と呼びます) を受け取り、inputArray で指定されたすべての数値を arrayA または arrayB に含むレコードをフェッチするクエリを作成するにはどうすればよいですか。

inputArray が [2, 6] の場合、クエリは次のようになります。arrayA または arrayB のいずれかに 2 と 6 を持つすべてのレコードを検索します。

これは次のように返されます。

id 1: 2 は arrayA にあり、6 は arrayB にあるため

id 3: 2 は arrayB にあり、6 は arrayA にあるため

id 4: 2 は arrayA にあり、6 は arrayA にあるため

id 5: 2 は arrayB にあり、6 は arrayB にあるため

これは私が思いつくことができる最高のものです:

db.collection.find({$or: [    
  {arrayA: {$all: [2, 6]}},
  {arrayB: {$all: [2, 6]}},
  {$and: [
    {arrayA: {$in: [2, 6]}},
    {arrayB: {$in: [2, 6]}}    
  ]}
]})



他に良い方法がないことに驚いています。

4

1 に答える 1

0

さて、これが別のバージョンです(これの効率について私に聞かないでください:))

db.ma.find({$or: [{arrayA: 2, arrayB: 6}, 
                  {arrayA: 6, arrayB: 2}, 
                  {arrayA: {$all: [2,6]}}, 
                  {arrayB: {$all: [2, 6]}}]})
于 2012-07-04T18:11:53.883 に答える