使用MongoDB中的$ all匹配数组中数组中的所有元素

Ser*_*gel 5 mongodb mongodb-query

我有一份文件,其中包含以下文件:

{ "f" : [ [ 1, 2, 3], [4, 5, 6] ] } // should match because of [1, 2, 3]
{ "f" : [ [ 2, 1, 3], [4, 5, 6] ] } // should match because of [2, 1, 3]
{ "f" : [ [ 1, 2, 4], [4, 5, 6] ] } // should NOT match
Run Code Online (Sandbox Code Playgroud)

在这个集合中,我想匹配文档,它在"f"字段的一个数组中包含一个包含1,2和3的数组.

到目前为止我尝试过的:

db.mytest.find({ f: { $elemMatch: { $all: [1,2,3] } } } )
Run Code Online (Sandbox Code Playgroud)

我希望这个查询能够正常工作,但我不明白为什么不这样做.我不匹配任何文件.

db.mytest.find({ f: { $elemMatch: { $elemMatch: { $all: [1,2,3] } } } })
Run Code Online (Sandbox Code Playgroud)

这也行不通.

db.mytest.find({ f: { $all: [[1,2,3]] } })
Run Code Online (Sandbox Code Playgroud)

这有效但元素必须按照确切的顺序排列.我希望能够匹配输入数组也是2,1,3.一种可能的解决方案必须是始终按升序存储元素并使用此查询.

db.mytest.find({ f: { $elemMatch: { $elemMatch: { $in: [1, 2, 3] } } } })
Run Code Online (Sandbox Code Playgroud)

这有效,但它匹配包含1,2或3中任何一个的所有文档.我只想要在单个数组中包含正好1,2和3的文档.

我在寻找什么查询?

Max*_*oel 1

您正在寻找f包含[1, 2, 3]. 尝试db.mytest.find({f: {$in: [[1, 2, 3]]}})

不幸的是,找到所有可能的排列的最简单方法是在程序中构造它们(如果您使用的是 Python,我们itertools.permutations会为您做这件事)并将$in查询更改为[[1, 2, 3], [2, 1, 3], ...]. 太糟糕了。