在MongoDB中仅添加另一个集合中的字段

7

I have two collections

A with schema

{
    a : Array,
    b : ObjectID
}

并且具有以下结构的B

{
    x : 'string',
    y : // some object schema
    ...
    b : ObjectID
}

我希望使用Mongo聚合在B集合中添加一个新字段,该字段仅包括使用B搜索A集合中的a字段。
我希望聚合后的值具有以下模式:
{
    x : 'string',
    newField : a // array from collection A
    y : // some object schema
    ...
    b : ObjectID
}

只有 $lookup 不起作用,因为我不想要整个对象,而且合并操作会删除 _id 并合并其他字段,这不是我想要的。

1个回答

19

在解决这个问题后,我自己回答。

可以按照以下操作的流水线来完成此操作:

{
    $lookup: {
        from: "A",
        localField: "b",
        foreignField: "b",
        as: "someField"
    }
},
{
    $addFields: {
      newField  : "$someField.a"
    }
},
{
    $unwind: "$newField"
},
{
    $project: {
        someField: 0
    }
}
更高效的答案将被接受。

1
我没有看到其他的方法,但根据优化文档:https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/,如果可能的话,$unwind阶段应该紧接在$lookup之后。 - PedroMVU
@PedroMVU 我不明白他们如何能够将 $unwind 提前,因为他们只在前一阶段创建了 $newField。 - grantal
没关系,你可以在某个字段上使用“取消”操作,并将其移动到上一个阶段。 - grantal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接