Javascript MongoDB在具有附加字段的对象数组上聚合$lookup

Javascript MongoDB在具有附加字段的对象数组上聚合$lookup,javascript,mongodb,mongoose,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有两个不同的集合(下面的示例)方法和项。现在,我正在使用3.6版本之前的香草聚合查询进行$lookup: 问题是,如果我正在使用它,在原始集合的$lookup阶段,我会丢失数量字段(来自方法.试剂嵌入)。现在,我在lookup之后返回quantity,但我听说Mongo从3.6版引入了lookup查询的新语法,因此问题是: 它能否解决我收到以下结果的问题: 项目 { "_id": 1, "name": "Test", "reagents": [

我有两个不同的集合(下面的示例)方法和项。现在,我正在使用3.6版本之前的香草聚合查询进行
$lookup

问题是,如果我正在使用它,在原始集合的
$lookup
阶段,我会丢失
数量
字段(来自
方法.试剂
嵌入)。现在,我在
lookup
之后返回
quantity
,但我听说Mongo从3.6版引入了
lookup
查询的新语法,因此问题是:

它能否解决我收到以下结果的问题:

项目

    {
      "_id": 1,
      "name": "Test",
      "reagents": [
        {
          _id: 1,
          quantity: 2
        },
        {
          _id: 2,
          quantity: 4
        }
      ]
    }
    {
      "_id": 1,
      "name": "ItemOne",
      "other": "field"
    },
    {
      "_id": 2,
      "name": "ItemTwo",
      "other": "field"
    }
与一起使用可为每个
试剂项目
查找相应的
试剂
,并应用以获取一个对象:

db.methods.aggregate([
    {
        $lookup: {
            from: "items",
            localField: "reagents._id",
            foreignField: "_id",
            as: "reagent_items"
        }
    },
    {
        $project: {
            _id:1,
            name: 1,
            reagents: 1,
            reagent_items: {
                $map: {
                    input: "$reagent_items",
                    as: "ri",
                    in: {
                        $mergeObjects: [
                            "$$ri",
                            {
                                $arrayElemAt: [ { $filter: { input: "$reagents", cond: { $eq: [ "$$this._id", "$$ri._id" ] } } }, 0 ]
                            }
                        ]
                    }
                }
            }
        }
    }
])

好吧,我在一个几乎相关的查询中遇到了一个问题:如果我在集合中的
\u id
字段上有索引,应该
查找
,并且
试剂
数组有
项id
反转顺序,例如不是
[1,2,3],而是[3,2,1],嗯
quantity`字段可能会在
$map
阶段后丢失正确的
项目
id。@Alexedim不确定我是否理解您的担心,有一个
{$eq:[“$$this.\u id”,“$$ri.\u id”]}
条件,因此订单不会影响匹配是的,我一开始没有看到它,到目前为止,我正在重新检查这件事。至于我的问题,注释中只有500个符号很难描述,但由于错误的模式模式,我破坏了我的第一个数据库。你能回答这个问题吗@米克尔
    {
      "_id": 1,
      "name": "ItemOne",
      "other": "field"
    },
    {
      "_id": 2,
      "name": "ItemTwo",
      "other": "field"
    }
db.methods.aggregate([
    {
        $lookup: {
            from: "items",
            localField: "reagents._id",
            foreignField: "_id",
            as: "reagent_items"
        }
    },
    {
        $project: {
            _id:1,
            name: 1,
            reagents: 1,
            reagent_items: {
                $map: {
                    input: "$reagent_items",
                    as: "ri",
                    in: {
                        $mergeObjects: [
                            "$$ri",
                            {
                                $arrayElemAt: [ { $filter: { input: "$reagents", cond: { $eq: [ "$$this._id", "$$ri._id" ] } } }, 0 ]
                            }
                        ]
                    }
                }
            }
        }
    }
])