gpt4 book ai didi

MongoDB查询带有排除的数组字段

转载 作者:IT老高 更新时间:2023-10-28 13:36:25 25 4
gpt4 key购买 nike

我搜索了一下,但找不到使用 MongoDB 的方法 - 或者我只是误解了 $all 和 $in 运算符。

如果我有以下文件:

{
arr : ["foo","bar","baz"]
},
{
arr : ["bar","foo"]
},
{
arr : ["foo"]
}

我想要一个返回最后两个文档的查询。基本上任何仅包含 ["foo", "bar"] 任意组合但不包括任何具有附加项目的文档的文档。这是我无法弄清楚的排除方面 - 基本上对于给定的数组,只返回 arr 字段仅包含该数组中的元素的文档。

> db.foo.find({arr : {"$in" : ["foo", "bar"]}})
{ "_id" : ObjectId("532a0ff6907560a1e88a2c0a"), "arr" : [ "foo", "bar", "baz" ] }
{ "_id" : ObjectId("532a0ffc907560a1e88a2c0b"), "arr" : [ "foo", "bar" ] }
{ "_id" : ObjectId("532a0ffe907560a1e88a2c0c"), "arr" : [ "foo" ] }
> db.foo.find({arr : {"$all" : ["foo", "bar"]}})
{ "_id" : ObjectId("532a0ff6907560a1e88a2c0a"), "arr" : [ "foo", "bar", "baz" ] }
{ "_id" : ObjectId("532a0ffc907560a1e88a2c0b"), "arr" : [ "foo", "bar" ] }
>

这甚至可能吗?我不知道在查询时哪些值是可排除的。

最佳答案

您可以通过组合多个运算符来做到这一点:

db.foo.find({arr: {$not: {$elemMatch: {$nin: ['foo', 'bar']}}}})

带有 $nin$elemMatch 正在查找单个 arr 元素既不是“foo”也不是“bar”的文档,然后父 $not 反转匹配以返回不匹配任何元素的所有文档。

但是,这也会返回 arr 缺失或没有元素的文档。要排除那些你需要 $and 在确保 arr 至少有一个元素的限定符:

db.foo.find({$and: [
{arr: {$not: {$elemMatch: {$nin: ['foo', 'bar']}}}},
{'arr.0': {$exists: true}}
]})

关于MongoDB查询带有排除的数组字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518867/

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