gpt4 book ai didi

mongodb - 使用 mongoDB 将嵌入式文档与父字段进行比较

转载 作者:可可西里 更新时间:2023-11-01 10:02:29 25 4
gpt4 key购买 nike

考虑以下集合,其中父文档有一个值为 100000amount 字段,并且有一个嵌入的文档数组具有相同的字段 amount 和相同的值。

{
"_id" : ObjectId("5975ce5f05563b6303924914"),
"amount" : 100000,
"offers" : [
{
"amount": 100000
}
]

有没有什么方法可以匹配所有至少有一个嵌入文档 offer 且金额与父级相同的对象?

例如,如果我查询这个,它工作得很好:

find({ offers: { $elemMatch: { loan_amount: 100000 } } })

但我不知道实际值 100000 在我试图组装的真实查询中,我需要为父文档金额字段使用一个变量。像这样。

find({ offers: { $elemMatch: { loan_amount: "parent.loan_amount" } } })

感谢任何建议。我希望用 $eq$elemMatch 来做到这一点,并避免聚合,但也许这是不可能的。

谢谢!

最佳答案

标准查询无法“比较”文档中的值。这实际上是您使用 .aggregate()$redact 做的事情:

db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}},
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])

这里我们使用$filter将父文档中 "amount" 的值与数组中的值进行比较。如果至少有一个“相等”,那么我们“$$KEEP”文档,否则我们“$$PRUNE”

在最近的版本中,我们可以使用 $indexOfArray 来缩短它.

db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$ne": [
{ "$indexOfArray": [ "$offers.amount", "$amount" ] },
-1
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])

如果您实际上也只想要“匹配的数组元素”,那么您可以添加 $filter在投影中:

db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}},
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$project": {
"amount": 1,
"offers": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}
}}
])

但主要原则当然是将返回的文档数量“减少”到那些真正符合条件的文档作为“第一”优先级。否则,您只是在进行不必要的计算和工作,这些工作会占用时间和资源,而您稍后会丢弃这些结果。

因此,首先“过滤”,其次是“ reshape ”。

关于mongodb - 使用 mongoDB 将嵌入式文档与父字段进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45412506/

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