Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB选择聚合管道中field1等于nested.field2的文档_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

MongoDB选择聚合管道中field1等于nested.field2的文档

MongoDB选择聚合管道中field1等于nested.field2的文档,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我使用“$lookup”在一个字段上加入了两个集合,而实际上我需要两个字段来进行唯一匹配。我的下一步是展开包含唯一匹配所需的第二个字段的不同值的数组,然后将这些值与需要匹配的第二个字段的值进行比较。但是,下面代码段中的第二行不返回任何结果 // Request only the page that has been viewed { '$unwind' : '$DSpub.PublicationPages'}, { '$match' : {'pageId' : '$DSpub.Publicat

我使用“$lookup”在一个字段上加入了两个集合,而实际上我需要两个字段来进行唯一匹配。我的下一步是展开包含唯一匹配所需的第二个字段的不同值的数组,然后将这些值与需要匹配的第二个字段的值进行比较。但是,下面代码段中的第二行不返回任何结果

// Request only the page that has been viewed
{ '$unwind' : '$DSpub.PublicationPages'},
{ '$match' : {'pageId' :  '$DSpub.PublicationPages.PublicationPageId' } }

有没有更合适的方法?或者我可以在执行“$lookup”之前展开“from”集合,然后匹配这两个字段,从而完全避免这样做吗?

这看起来并不容易

$match
不对动态数据进行操作(这意味着我们将静态值与数据集进行比较)。为了克服这一点,我们可以使用$project phase添加bool静态标志,
$match

请参见下面的示例:

具有如下输入集合:

[{
        "_id" : ObjectId("56be1b51a0f4c8591f37f62b"),
        "name" : "Alice",
        "sub_users" : [{
                "_id" : ObjectId("56be1b51a0f4c8591f37f62a")
            }
        ]
    }, {
        "_id" : ObjectId("56be1b51a0f4c8591f37f62a"),
        "name" : "Bob",
        "sub_users" : [{
                "_id" : ObjectId("56be1b51a0f4c8591f37f62a")
            }
        ]
    }
]
我们只想获取
\u id
$docs.sub\u用户。\u id“
相同的字段,其中
文档
$lookup
输出

db.collecction.aggregate([{
            $lookup : {
                from : "collecction",
                localField : "_id",
                foreignField : "_id",
                as : "docs"
            }
        }, {
            $unwind : "$docs"
        }, {
            $unwind : "$docs.sub_users"
        }, {
            $project : {
                _id : 0,
                fields : "$$ROOT",
                matched : {
                    $eq : ["$_id", "$docs.sub_users._id"]
                }
            }
        }, {
            $match : {
                matched : true
            }
        }
    ])
这就产生了输出:

{
    "fields" : {
        "_id" : ObjectId("56be1b51a0f4c8591f37f62a"),
        "name" : "Bob",
        "sub_users" : [ 
            {
                "_id" : ObjectId("56be1b51a0f4c8591f37f62a")
            }
        ],
        "docs" : {
            "_id" : ObjectId("56be1b51a0f4c8591f37f62a"),
            "name" : "Bob",
            "sub_users" : {
                "_id" : ObjectId("56be1b51a0f4c8591f37f62a")
            }
        }
    },
    "matched" : true
}

这是我的荣幸。我有一个类似的问题要解决,只是我试图匹配两个独立嵌套集合中的字段。结果发现我错过了嵌套集合管道中的$unwind阶段。感谢您的示例,因为这对我有很大帮助。干杯!