Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 如何在mongo中匹配同一文档中的字段值?_Mongodb - Fatal编程技术网

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

Mongodb 如何在mongo中匹配同一文档中的字段值?,mongodb,Mongodb,我有以下文件: { "_id" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab", "field1" : { "c1" : "bfc523ad-c09d-4be8-99c2-64a709cf95ab", "c2" : "pl_PowerList_bfc523adc09d4be899c264a709cf95ab", }, "Columns" : [ { "nam

我有以下文件:

{
    "_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(在任何一列中)的所有文档。我尝试了以下查询:

db.mycollection.find({$where:"this.field1.c1 == this.Columns.lookup.id"})
当我执行上面的查询时,我得到一个错误,说字段id未定义。我想要所有这样的文档,其中至少有一列的lookup.id与该文档的field1.c1相同。我该怎么做

您可以尝试以下方法:

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;
    }
})

使用聚合框架,您可以利用管道操作符。这允许您递归地遍历文档结构,并基于对每个级别的指定条件的评估执行一些操作

与使用操作符相比,使用聚合框架可以大大提高性能

这个概念可能有点难理解,但基本上运算符允许您使用运算符处理逻辑条件,并使用特殊操作来“保留”逻辑条件为真的文档或来“删除”条件为假的文档

此操作类似于有一个管道,该管道选择集合中的字段并创建一个新字段,该字段保存逻辑条件查询的结果,然后创建一个后续的,除了使用单个管道阶段,该阶段根据查看数据所需的访问权限限制结果集的内容,并且效率更高


要在
field1.c1
值等于
列的所有文档上运行查询。lookup.id
(在任何列中),请包括阶段,如下所示:

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