如何查询嵌套在文档数组中的数组的mongodb集合?

时间:2018-04-03 14:48:03

标签: mongodb mongodb-query

我有一个包含结构相似文档的mongo集合,如下图所示 -

{
    "_id" : ObjectId("mongoid"),
    "type" : "chemical",
    "sourceId" : "27553452120",
    "array1" : [
        {
            "cid" : "1235689",
            "outcome" : "test",
            "relation" : "=",
            "array2" : [
                {
                    "name" : "test1"
                },
                {
                    "name" : "test2"
                },
                {
                    "value" : 1.628,
                    "name" : "test3"
                },
                {
                    "value" : 1.63,
                    "name" : "test4"
                }
            ]
        }
    ]
}

我想查询此集合的案例,array1.array2.length > 1

我尝试在mongo shell上进行以下示例查询:

db.collection.find({"array1.array2":{$exists:true},$where:"this.array1.array2.length>1"}).limit(1).pretty()

失败陈述

Error: error: {
    "ok" : 0,
    "errmsg" : "TypeError: this.array1.array2 is undefined :\n@:1:15\n",
    "code" : 139,
    "codeName" : "JSInterpreterFailure"
}

如何实现此查询?

4 个答案:

答案 0 :(得分:0)

这可以解决您的问题。

db.test.aggregate(
{
$match:{"array1.array2": {$nin:[null,[]]}}
}
).pretty();

答案 1 :(得分:0)

试试这个

array

答案 2 :(得分:0)

根据上述问题的描述,请尝试执行以下聚合查询作为解决方案。

db.collection.aggregate(

        // Pipeline
        [
            // Stage 1
            {
                $match: {
                    array1: {
                        $elemMatch: {
                            array2: {
                                $exists: true
                            }
                        }
                    }
                }
            },

            // Stage 2
            {
                $project: {
                    array2size: {
                        $size: {
                            $arrayElemAt: ['$array1.array2', 0]
                        }
                    },
                    array1: 1
                }
            },

            // Stage 3
            {
                $match: {
                    'array2size': {
                        $gt: 0
                    }
                }
            },

        ]



    );

答案 3 :(得分:0)

这样:

db.test.find({"array1.array2.1":{$exists:1}})

这更灵活,它允许您查询任何长度,而不仅仅是1。

最后“.1”它是基于零的数组索引。因此,如果索引1存在,则意味着数组至少有2个元素。你可以搜索< N通过将$ exists更改为0.如果数组中没有索引3,则表示数组少于4个元素。

如果您需要搜索确切大小,可以使用$ size operator

db.test.find({"array1.array2":{$size:5}})