如何匹配mongo中同一文档的字段值?

时间:2017-09-28 08:48:18

标签: mongodb

我有一份以下文件:

{
    "_id" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab",
    "field1" : {
        "c1" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab",
        "c2" : "pl_PowerList_bfc523adc09d4be899c264a709cf95ab",
    },
    "Columns" : [ 
        {
            "name" : "abc49777",
            "lookup":{
                "id":"bfc523ad-c09d-4be8-99c2-64a709cf95ab"
            }

        }, 
        {
            "name" : "abc7846",
            "lookup":{
                "id":"cgc523ad-c09d-4be8-99c2-64a709cf95xy"
            }

        }
    ]
}

现在我想获取field1.c1值等于Columns.lookup.id(在任何一个colums中)的所有文档。我尝试了以下查询:

db.mycollection.find({$where:"this.field1.c1 == this.Columns.lookup.id"})

当我执行上述查询时,我收到错误消息,指出字段ID未定义。我想要所有这样的文档,其中至少一列具有lookup.id与该文档的field1.c1相同。我该怎么做?

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

db.mycollection.find( 
{ $where: 
    function() {
        var array = this.Columns;
        for (var i in array) {
            if(array[i].lookup.id == this.field1.c1) {
                return true;
            }
        }
        return false;
    }
})

答案 1 :(得分:0)

使用聚合框架,您可以利用 $redact 管道运算符。这允许您以递归方式下降文档结构,并根据每个级别的指定条件的评估执行一些操作。

使用聚合框架的性能大大提高,而不是使用 $where 运算符。

这个概念可能有点棘手,但基本上操作符允许您使用 $cond 运算符处理逻辑条件并使用特殊操作 {{3} “保留”逻辑条件为true的文档或 $$KEEP 以“删除”条件为false的文档。

此操作类似于具有 $$PRUNE 管道,该管道选择集合中的字段并创建一个新字段,其中包含逻辑条件查询的结果,然后是后续的 $project ,但 $match 使用单个管道阶段,该阶段根据查看数据所需的访问权限限制结果集的内容,效率更高

要对field1.c1值等于Columns.lookup.id(在任意一个列中)的所有文档运行查询,请包含 $redact 阶段在下面:

db.mycollection.aggregate([
    {
        "$redact": {
            "$cond": [
                {
                    "$setIsSubset": [
                        ["$field1.c1"],
                        {
                            "$map": {
                                "input": "$Columns",
                                "as": "col",
                                "in": "$$col.lookup.id"
                            }
                        }
                    ]
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])