Mongodb 我们可以使用$lookup让多个localFields引用多个foreignFields吗

Mongodb 我们可以使用$lookup让多个localFields引用多个foreignFields吗,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我们可以在MongoDB中使用以下示例中的多种条件连接两个集合吗 范例 db.Person.aggregate([ { $lookup : { from: "Person", localField: "_id", localField: “businessGroup", foreignField: “personId", foreignFiel

我们可以在MongoDB中使用以下示例中的多种条件连接两个集合吗

范例

db.Person.aggregate([
    { $lookup : {
        from: "Person",           
        localField: "_id",           
        localField:  “businessGroup",       
        foreignField:  “personId",  
        foreignField:  “businessGroupCode",         
        as: "person"      
    } }
])
谢谢

有关我的查询的更多详细信息

我有3个系列,col1,col2,col3。我需要加入这些集合,以便我的输出具有

来自Col1的ScenarioName和来自Col2的runId以及来自col3i.e Col2.runId=col3.runId的最新结果

**testscenario:**


{
    "_id" : ObjectId("57f41cb9319ed34079df8a2d"),
    "environment" : "STAGE",
    "component" : "test1",
    "scenarioName" : "Jira-1234",
    "testClass" : "com.test.Test1",

}

**componentrunId:**

{
    "_id" : ObjectId("57fc5f56e40a93f2e0ae953c"),
    "componentName" : "test1",
    "runId" : 415
}

**testResults :**

{
    "_id" : ObjectId("5914d0019385b71384e01b2e"),
    "_class" : "com.test.TestResults",
    "testScenarioId" : ObjectId("5900fbc1aa42d292ecf596ab"),
    "runId" : 608,
    "runDate" : ISODate("2017-05-11T20:56:19.226Z"),
    "status" : "inprogress",
    "retryCount" : 0.0
}

/* 2 */
{
    "_id" : ObjectId("5915b609637b4a42d362babb"),
    "_class" : "com.test.TestResults",
    "testScenarioId" : ObjectId("58a4b2028f67f440d08b9845"),
    "runId" : 607,
    "runDate" : ISODate("2017-05-12T13:18:01.305Z"),
    "status" : "passed"
}

/* 3 */
{
    "_id" : ObjectId("5915b60c637b4a42d362babc"),
    "_class" : "com.test.TestResults",
    "testScenarioId" : ObjectId("57ffa1a67ae6ee5093b978cb"),
    "runId" : 606,
    "runDate" : ISODate("2017-05-12T13:18:04.106Z"),
    "status" : "passed"
}
我写的疑问

db.testScenario.aggregate(
[
{
    $lookup: 
    {
          from: "componentRunId",
          localField: "component",
          foreignField: "componentName",
          as: "testScenario_docs"
    }
},{
        $project:{
            "_id":"$_id",
            "scenarioName" :"$scenarioName",
            "runId" : "$testScenario_docs.runId",
            "componentName" :"$testScenario_docs.componentName"
        }
    },
     {
        $out:"varunTmp"
    }   

])

db.varunTmp.aggregate([
    {$lookup:
        {
           from: "testResults",
           localField: "_id",
            //localField: "runId",
           foreignField: "testScenarioId",
           // foreignField: "runId",
           as: "finalResult"
        }
    },
    {
        $unwind:"$finalResult"
    },

    {
        $project:{
            "runId" : "$finalResult.runId",
            "status" : "$finalResult.status",
            "scenarioName" :"$scenarioName"
        }
    }

])

您正在寻找的用法涉及多个操作以获得结果,而不是试图在单个管道阶段中包含所有参数

db.testscenario.aggregate[ {$lookup:{ 发件人:componentrunId, localField:component, foreignField:组件名称, as:组件 }}, {$unwind:{path:$component,preserveNullandmptyarray:true}, {$lookup:{ 来源:testResults, localField:runId, foreignField:runId, as:测试 }} ] 从这个基础上,您可以投影您想要的任何字段和/或执行您想要的任何操作,但所有字段的基本内容都将可用

请注意,如果找不到componentrunId集合中的匹配文档,则此处可能会导致删除文档。这里的结果将是一个空数组,您可以使用文档中描述的PreserveNullAndEmptyArray语法来解决这个问题


<>你也可以考虑一下,你的设计模式是非常相关的,但在文档数据库中使用,这通常不是最好的做法。根据经验,如果您能够运行此聚合语句而不受BSON限制,那么您可能应该首先嵌入数据。

不,您不能。用法完全如图纸所示。虽然您可以按预期用途执行多个$lookup阶段,但我怀疑您正在尝试执行层次图。并不是说不可能像您可能希望的那样通过对象递归。你可能想看看。但你的问题缺乏你的结构细节和想要真正说出的目标。应该说,注意这是不可能的。@NeilLunn:为我的问题提供了更多的细节,不那么迟钝并提供集合名称可能会有所帮助,特别是考虑到这些对于$lookup操作至关重要。但问题究竟是什么?所有结果都来自col1,将它的component字段连接到col2的componentName字段,然后在col2中的runId上连接到col3中的相同属性?如果这是真的,那可能是更清楚的说法。您还应该明确col1与col2之间是否存在严格的1:1关系。至少很清楚,col2到col3是一对多。这是你想要的吗?同样,如果集合名称在use@NeilLunn:是的,你说得对。我更新了集合名称,使其更加清晰。testscenario和componentRunId是1:1,testResults是1对多。查询正在返回结果。它正在从TestResults集合而不是具有最新运行Id的集合检索所有结果