如何限制从$ lookup操作返回的字段添加到Mongo视图

时间:2018-03-22 18:42:06

标签: javascript node.js mongodb aggregation-framework lookup

在我的MongoDB / Node后端设置中,我使用Studio 3T的管道运算符组合来创建特定视图。该管道中的一个步骤涉及使用$lookup运算符从第二个集合中提取相关数据。此代码如下所示:

// Stage 3
{
  $lookup: {
    "from": "clients",
    "localField": "client.id",
    "foreignField": "_id",
    "as": "client"
  }
}

要将此作为对象而不是数组放入视图中,我将使用$unwind运算符,如下所示:

// Stage 4
{
    $unwind: {
       path : "$client"
    }
}

现在这样可行,因为来自其他集合的相应记录的信息完全落入视图我想要的位置。然而,问题是,当我真正需要的是来自该对象的三个项目时,这会从相应的记录中提取所有字段;即_idname.first以及name.last

现在我得到这样的东西:

client: {
    _id: someId,
    prop1: value,
    prop2: value,
    prop3: value,
    name: {
      first: value,
      last: value
    }
    prop4: value
}

当我需要的只是这个:

client: {
    _id: someId,
    name: {
      first: value,
      last: value
    }
}

我查看了mongo文档,但我不清楚如何限制从$ lookup操作打印到视图的数据量。我是否需要在$ lookup操作中添加一些条件逻辑?或者是否还有其他一些操作员应该对管道进行处理?

1 个答案:

答案 0 :(得分:1)

“重塑”输出文档听起来与使用$project管道阶段的方式非常相似。

在这种情况下,只需在$project阶段之后添加$lookup,它就应该符合目的。这是一个明显的方法。 像这样:

if let secIdentity = (dictionary as AnyObject).value(forKey: kSecImportItemIdentity as String) {
            let securityError = SecIdentityCopyPrivateKey(secIdentity as! SecIdentity , &privateKeyRef)
            if securityError != noErr {
                privateKeyRef = nil
            }
        }