gpt4 book ai didi

mongodb - `$eq` 运算符是否使用数组点表示法?

转载 作者:行者123 更新时间:2023-12-04 08:37:50 25 4
gpt4 key购买 nike

我正在尝试使用 $expr 编写聚合查询内$lookup$match流水线阶段。我发现了一些与数组点符号相关的问题。
想象一个集合 relations使用名为 nodes 的数组字段.
以下查询工作正常,返回正确的结果:

db.relations.find({"nodes.0": { "type" : "User", "id" : UUID("dc20f7c7-bd45-4fc1-9eb4-3604428fa551") }})
但是下面的一个什么都不返回:
db.relations.find({$expr: {$and: [ {$eq: ["$nodes.0", { "type" : "User", "id" : UUID("dc20f7c7-bd45-4fc1-9eb4-3604428fa551") }]}]}})
对我来说,它们似乎实际上是相同的,我不明白为什么结果不同。
我尝试使用 $arrayElemAt运算符,它可以工作,但不幸的是它触发了 COLLSCAN 执行计划,这是不可取的,因为我在 nodes.0 上有一个索引.
我没有发现 $eq 有什么特别之处文档中的运算符,他们甚至明确提到这两种表达式形式是等价的。

最佳答案

Does the $eq operator work with array dot notation?


$nodes.0不是 $eq aggregation operator 中的正确表达式, 与数组字段一起使用时。 $eq aggregation operator有以下 snytax:
{ $eq: [ <expression1>, <expression2> ] }

您必须使用 $reduce连同 $arrayElemAt在 $eq 运算符中访问您的字段:
查询1
db.relations.find({
$expr: {
$eq: [
{
$reduce: {
input: [
{
$arrayElemAt: [
"$nodes",
0
]
}
],
initialValue: false,
in: {
"$and": [
{
$eq: [
"$$this.type",
"User"
]
},
{
$eq: [
"$$this.id",
UUID("dc20f7c7-bd45-4fc1-9eb4-3604428fa551")
]
}
]
}
}
},
true
]
}
})
Playground
替代方法,使用 $eq 运算符 { <field>: { $eq: <value> } } 查询2
db.relations.find({
"$and": [
{
"nodes.0.type": {
$eq: "User"
}
},
{
"nodes.0.id": {
$eq: UUID("dc20f7c7-bd45-4fc1-9eb4-3604428fa551")
}
}
]
})
MongoDB Playground
如果要执行 IXSCAN,可以使用 查询2 .您必须创建以下索引:
db.relations.ensureIndex({"nodes.0.id":1})
db.relations.ensureIndex({"nodes.0.type":1})

关于mongodb - `$eq` 运算符是否使用数组点表示法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64713634/

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