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)并获取包含在 arrayA 或 arrayB 中的所有由 inputArray 指定的数字的记录。

如果 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 回答