Node.js 将集合加入现有聚合查询mongodb
我的mongodb数据库中有以下集合结构 订单Node.js 将集合加入现有聚合查询mongodb,node.js,mongodb,express,mongodb-query,Node.js,Mongodb,Express,Mongodb Query,我的mongodb数据库中有以下集合结构 订单 [ { "_id":"order_abcd", "name":"Order 1" }, { "_id":"order_defg", "name":"Order 2" } ] { "_id":"transaction_abcd" "id_session" : ObjectId("session_abcd") } 会话 { "_id":"s
[
{
"_id":"order_abcd",
"name":"Order 1"
},
{
"_id":"order_defg",
"name":"Order 2"
}
]
{
"_id":"transaction_abcd"
"id_session" : ObjectId("session_abcd")
}
会话
{
"_id":"session_abcd"
"orders": [ ObjectId("order_abcd"), ObjectId("order_defg") ]
}
交易
[
{
"_id":"order_abcd",
"name":"Order 1"
},
{
"_id":"order_defg",
"name":"Order 2"
}
]
{
"_id":"transaction_abcd"
"id_session" : ObjectId("session_abcd")
}
我试图实现的是一个类似于此的数据集
[
{
"_id":"order_abcd",
"name":"Order 1",
"transaction":"transaction_abcd"
},
{
"_id":"order_defg",
"name":"Order 2",
"transaction":"transaction_abcd"
}
]
除了用于筛选订单的
开始日期
和结束日期
之外,我没有任何输入数据,查询主要用于报告目的,因此实际上我正在尝试生成一个查询,以获取给定时间段内的所有订单,并将每个订单的事务id附加到该查询。我们可以使用两个$lookup
(类似于SQL中的两个表联接)在每个阶段使用$unwind
,最终获得所需的键值对
db.Session.aggregate([
{
$lookup: {
from: "Transactions",
localField: "_id",
foreignField: "id_session",
as: "transaction_info"
}
},
{ $unwind: "$transaction_info" },
{
$lookup: {
from: "Orders",
localField: "orders",
foreignField: "_id",
as: "order_info"
}
},
{ $unwind: "$order_info" },
{$project:{
_id:"$order_info._id",
name:"$order_info.name",
transaction:"$transaction_info._id"
}}
]).pretty();
它给出了一个输出:
{
"_id" : "order_abcd",
"name" : "Order 1",
"transaction" : "transaction_abcd"
},
{
"_id" : "order_defg",
"name" : "Order 2",
"transaction" : "transaction_abcd"
}
展开阶段用于分解查找,然后在最终项目阶段对字段进行樱桃拾取
++UPDATE++
另一个可能有助于减少第二阶段查找记录的选项,因为可以应用订单日期的$match
,将过滤后的文档传递给下一阶段
db.Session.aggregate([
{
$lookup: {
from: "Orders",
localField: "orders",
foreignField: "_id",
as: "order_info"
}
},
{ $unwind: "$order_info" },
{
$match: {} //filter on "order_info.property" (i:e; date,name,id)
},
{
$lookup: {
from: "Transactions",
localField: "_id",
foreignField: "id_session",
as: "transaction_info"
}
},
{ $unwind: "$transaction_info" },
{
$project: {
_id: "$order_info._id",
name: "$order_info.name",
transaction: "$transaction_info._id"
}
}
]).pretty();
这是可行的,但看起来这将是一项艰巨的任务,因为mongo必须完成所有会话
集合,然后将它们与各自的事务
文档连接起来,然后才能运行与过滤器订单
的匹配。有没有办法在管道的早期运行匹配以减少mongo必须执行查找的文档数量?@JudeFernandes我不确定这会有多大帮助,除非我们能够对其进行基准测试,由于我们在交易
或会话
上没有真正的过滤器,因此其他方法可以是加入集合会话->订单
,然后按您提到的日期为订单
进行$match
匹配,然后将$lookup
转换为交易
。谢谢,这看起来确实可行,我会再等一会儿,看看还有没有其他答案,把你的答案标为正确答案。