node.js - 匹配查找聚合中存在于数组中的嵌套对象字段
问题描述
我有两个系列Projects
和Users
.
Projects
有一个包含以下内容的预算字段:1)amount
和 2)currency
{
_id: ObjectId(...),
type: 'typeA',
budget: {
amount: 123,
currency: 'USD'
}
}
Users
有一个名为的字段bids
,其中包含具有字段amount
和的对象列表currency
。
{
_id: ObjectId(...),
name: "User name",
bids: [{amount: 123, currency: "USD"}, {amount: 342, currency: "INR"}]
}
我正在尝试Users
使用Projects
查找聚合加入。
db.Projects.aggregate([
{
$lookup: {
from: "Users",
let: { projectAmount: "$budget.amount", projectCurrency: "$budget.currency" },
pipeline: [
{$match: {
$expr: {
$and: [
{ $eq: ["$bids.amount", "$$projectAmount"] },
{ $eq: ["$bids.currency", "$$projectCurrency"] }
]
}
}}
],
as: "matchingBids"
}
]);
但是,尽管用户集合中有一些匹配的对象,但我总是得到空结果。我浏览了官方文档和互联网,但没有发现任何帮助。任何帮助,将不胜感激。谢谢
解决方案
尝试$in
具有完整对象和数组的运算符
- 将预算对象传入
let
- 用数组检查
$in
条件bids
db.Projects.aggregate([
{
$lookup: {
from: "Users",
let: { budget: "$budget" },
pipeline: [
{
$match: {
$expr: { $in: ["$$budget", "$bids"] }
}
}
],
as: "matchingBids"
}
}
])
警告:
只有当对象中的字段顺序和对象数组应该相同时,上述方法才有效,下面的示例将不起作用!
budget: { amount: 123, currency: "USD" } bids: [{ currency: "USD", amount: 123 }]
或者
budget: { currency: "USD", amount: 123 } bids: [{ amount: 123, currency: "USD" }]
编辑:
经过一些解决方法后,我找到了一种方法来确保匹配确切的字段以克服上述情况,
$or
条件与字段位置的可能性{amount, currency}
和{currency, amount}
db.Projects.aggregate([
{
$lookup: {
from: "Users",
let: { budget: "$budget" },
pipeline: [
{
$match: {
$expr: {
$or: [
{
$in: [
{ amount: "$$budget.amount", currency: "$$budget.currency" },
"$bids"
]
},
{
$in: [
{ currency: "$$budget.currency", amount: "$$budget.amount" },
"$bids"
]
}
]
}
}
}
],
as: "matchingBids"
}
}
])
推荐阅读
- pytorch - 如何从 jit::script::module 访问模块属性,例如卷积步长
- python - Python - 如何在 UTF-8 编码文本中添加换行符?
- java - Java 在要追加的 ArrayList 中找到最高值
- node.js - 如何在 Express JS 中解码 URI 参数
- kubernetes - 在本地 kubernetes 集群上运行简单的临时 Kafka 实例时出现问题
- xamarin - 如何真正禁用 xamarin 表单中的黑暗主题?
- okta - 用于自定义声明的 OKTA 授权服务器“命名空间”
- python - Pandas 过滤后给了我一个空的数据框
- python - 如何减少通过 Python 中的泡菜转储的图像对象大小
- javascript - 如何在nuxt中正确使用注入功能