【问题标题】:MongoDB select documents where field1 equals nested.field2 in aggregate pipelineMongoDB在聚合管道中选择field1等于nested.field2的文档
【发布时间】:2016-09-11 05:49:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    这并不像看起来那么容易。

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

    请看下面的例子:

    有这样的输入集合:

    [{
            "_id" : ObjectId("56be1b51a0f4c8591f37f62b"),
            "name" : "Alice",
            "sub_users" : [{
                    "_id" : ObjectId("56be1b51a0f4c8591f37f62a")
                }
            ]
        }, {
            "_id" : ObjectId("56be1b51a0f4c8591f37f62a"),
            "name" : "Bob",
            "sub_users" : [{
                    "_id" : ObjectId("56be1b51a0f4c8591f37f62a")
                }
            ]
        }
    ]
    

    我们只想获取_id$docs.sub_users._id" 相同的字段,其中docs$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 阶段。感谢您的示例,因为这对我有很大帮助。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多