每个文档都有一个用户数组。如果一个文档的用户数组中有值-〉['123','456']或['456','123'],我想在数据库中检查,顺序无关紧要,但我需要这些且仅这些值出现在用户数组中。我基本上是在寻找类似set(users.array) == set(456, 123)的东西我尝试使用$in运算符,但它不能正常工作,因为如果只有其中一个存在,它会给出“true”,而$all(如我所见)不会检查这些值是否是唯一存在的值。
['123','456']
['456','123']
set(users.array) == set(456, 123)
$in
$all
yi0zb3m41#
您将需要测试2项内容:
$all查询运算符处理第一个测试。{$all: ["123","456"]}对于第二个测试,您可以使用then $nin操作符{$nin: ["123","456"]}。因为它一次测试整个数组,所以它本身只匹配不包含所需值的文档。使用$elemMatch运算符对每个元素分别应用$nin测试可以匹配不需要的文档。{$elemMatch:{$nin: ["123","456"}}使用$not反转$eleMatch以消除不需要的文档。把这些放在一起:
{$all: ["123","456"]}
{$nin: ["123","456"]}
$nin
{$elemMatch:{$nin: ["123","456"}}
$eleMatch
{$and: [ {key: {$all: ["123","456"]}}, {key: {$not: {$elemMatch: {$nin: {"123","456"}}}}} ]}
Playground
1条答案
按热度按时间yi0zb3m41#
您将需要测试2项内容:
$all查询运算符处理第一个测试。
{$all: ["123","456"]}
对于第二个测试,您可以使用then $nin操作符
{$nin: ["123","456"]}
。因为它一次测试整个数组,所以它本身只匹配不包含所需值的文档。使用$elemMatch运算符对每个元素分别应用
$nin
测试可以匹配不需要的文档。{$elemMatch:{$nin: ["123","456"}}
使用$not反转
$eleMatch
以消除不需要的文档。把这些放在一起:
Playground