Javascript MongoDB在具有附加字段的对象数组上聚合$lookup
我有两个不同的集合(下面的示例)方法和项。现在,我正在使用3.6版本之前的香草聚合查询进行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": [
$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 ]
}
]
}
}
}
}
}
])