gpt4 book ai didi

mongodb - 查找具有仅包含特定值而不包含其他值的数组字段的文档

转载 作者:行者123 更新时间:2023-12-04 08:35:49 26 4
gpt4 key购买 nike

考虑这个集合:

{
{ name: 'first', toys: ['doll', 'car', 'doll'],
{ name: 'second', toys: ['doll', 'car'],
{ name: 'third', toys: ['doll', 'car', 'bricks'],
{ name: 'fourth', toys: ['doll', 'bricks'],
{ name: 'fifth', toys: []
}
我想查询 toys 的文档field 是一个只包含 doll 的数组和 car .在这种情况下,两个 firstsecond应该匹配。 first匹配,因为 dollcar可以在数组中重复, third不匹配,因为数组中不得存在其他值,并且 fourthfifth不匹配,因为它们不包含两者 dollcar .
使用 $all$in对我不起作用,因为它们匹配 third .我怎样才能做到这一点?谢谢!

最佳答案

更好的方法是使用聚合运算符 $setEquals 它比较两个或多个数组,如果它们具有相同的不同元素,则返回 true,否则返回 false:

db.collection.find({
'$expr': {
'$setEquals': ['$toys', ['doll', 'car']]
}
})

另一种选择是 $setDifference 它接受两个数组,并相对于第一个数组执行第二个数组的相对补码,并且此操作不需要元素按顺序排列。
在你的情况下,使用来自 $setDifference 的结果检查它是否为空并将其设置为查询的基础。
例如操作
{ $setDifference: [ ['doll', 'car', 'doll'], ['doll', 'car'] ] } => []
和这个
{ $setDifference: [ ['car', 'doll', 'doll'], ['doll', 'car'] ] } => []
{ $setDifference: [ ['car', 'doll'], ['doll', 'car'] ] } => []
或者
{ $setDifference: [ ['doll', 'car'], ['doll', 'car'] ] } => []
{ $setDifference: [ ['doll', 'car', 'bricks'], ['doll', 'car'] ] } => ['bricks']
使用上面的逻辑,作为助手,您可以使用 $size 获取数组结果的长度并使用 $expr 检查您的查询表达式是否为 0

最终查询:
db.collection.find({
'$expr': {
'$eq': [
{ '$size': {
'$setDifference': [
'$toys',
['doll', 'car']
]
} },
0
]
}
})

关于mongodb - 查找具有仅包含特定值而不包含其他值的数组字段的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64806586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com