Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将集合加入现有聚合查询mongodb_Node.js_Mongodb_Express_Mongodb Query - Fatal编程技术网

Node.js 将集合加入现有聚合查询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

我的mongodb数据库中有以下集合结构

订单

[  
   {  
      "_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
转换为
交易
。谢谢,这看起来确实可行,我会再等一会儿,看看还有没有其他答案,把你的答案标为正确答案。