Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js 在同一父文档中联接MongoDB子文档

Node.js 在同一父文档中联接MongoDB子文档,node.js,mongodb,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongodb Query,Aggregation Framework,鉴于此订单集合: //订单文档 [ { _id:“订单123”, 项目:[ {{u id:“item_123”,类型:“T恤”}, {{u id:“item_234”,类型:“Hoodie”}, {{u id:“item_345”,键入:“Hat”}, ], 退款:[ { _id:“退款”, 项目:[“项目123”、“项目234”], }, { _id:“退款234”, 项目:[“项目345”], }, ], }, ] 是否可以映射退款项目->项目。_id,允许我们按类型进行筛选 这是我们当前

鉴于此
订单
集合:

//订单文档
[
{
_id:“订单123”,
项目:[
{{u id:“item_123”,类型:“T恤”},
{{u id:“item_234”,类型:“Hoodie”},
{{u id:“item_345”,键入:“Hat”},
],
退款:[
{
_id:“退款”,
项目:[“项目123”、“项目234”],
},
{
_id:“退款234”,
项目:[“项目345”],
},
],
},
]
是否可以映射
退款项目
->
项目。_id
,允许我们按
类型进行筛选

这是我们当前获取退款子文档的方式:

db.orders.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        order: "$$ROOT",
        refunds: "$$ROOT.refunds",
      },
    },
  },
  {
    $unwind: "$refunds",
  },
  {
    $project: {
      order: "$order",
      refund: "$refunds",
    },
  },
]);
这给了我们:

// Refund documents
[
  {
    refund: {
      _id: "refund_123",
      items: ["item_123", "item_234"],
    },
    order: { ... }, // The original order document
  },
  {
    refund: {
      _id: "refund_234",
      items: ["item_345"],
    },
    order: { ... }, // The original order document
  },
]
从这里,我们要映射
退款.items
->
订单.items.\u id
以生成以下输出:

[
{
_id:“退款”,
项目:[
{{u id:“item_123”,类型:“T恤”},
{{u id:“item_234”,类型:“Hoodie”},
],
},
{
_id:“退款234”,
项目:[
{{u id:“item_345”,键入:“Hat”}
],
},
]

允许我们按
类型筛选退款文档

您可以使用
$unwind
$filter
进行此操作

  • $unwind
    解构数组
    退款
  • $project
    \u id
    中显示退款id,并使用
    $filter
    筛选
    退款中的
    项目

请显示所需的结果。
db.orders.aggregate([
  { $unwind: "$refunds" },
  {
    $project: {
      _id: "$refunds._id",
      items: {
        $filter: {
          input: "$items",
          cond: { $in: ["$$this._id", "$refunds.items"] }
        }
      }
    }
  }
])