如何返回数组字段大小大于给定数字的所有文档?

时间:2016-01-27 08:38:52

标签: mongodb mongodb-query aggregation-framework

我有一个像

这样的文件
{
    "_id": ObjectId('56a77bfae0ce9f6a738cb2b7'),
    "nameIdentity": [
        {
            "givenNameOne": "LATANYA",
            "givenNameThree": "BIZOR",
            "lastName": "BIZOR",
            "sourceReferenceId": [
                {
                    "sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
                    "sourceName": "A"
                },
                {
                    "sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
                    "sourceName": "B"
                }
            ]
        }
    ]
}

nameIdentity是一个数组,sourceReferenceId是nameIdentity中的嵌套数组。我试图获取sourceReferenceId大小大于2的文档。 我用这样的聚合:

db.entity.aggregate(
   [
      {
         $project: {
            nameIdentity_count: {$size: "$nameIdentity.sourceReferenceId"}
         }
      },
      {
        "$match": {
            "nameIdentity_count": { "$gte": 2 }
         }
    }
   ]
)

这没有按预期工作,它甚至用一个soureReferenceId给文件。任何人都可以告诉我哪里出错了?

3 个答案:

答案 0 :(得分:4)

您需要使用dot notation$exists运算符。如果你想要的只是find()那些" sourceReferenceId"那么你也不需要聚合。大小大于2

db.collection.find( { "nameIdentity.sourceReferenceId.2": {  "$exists": true } } )

但如果您确实需要汇总数据,那么:

db.collection.aggregate([
    { "$match": { "nameIdentity.sourceReferenceId.2": {  "$exists": true } } } 
])

另外,你有一个设计问题,因为有一个值总是一个元素数组的字段没有任何意义。您应该考虑更改文档结构,使其如下所示:

{
    "_id": ObjectId('56a77bfae0ce9f6a738cb2b7'),
    "givenNameOne": "LATANYA",
    "givenNameThree": "BIZOR",
    "lastName": "BIZOR",
    "sourceReferenceId": [
        {
            "sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
            "sourceName": "A"
        },
        {
            "sourceReferenceId": "56a77bfae0ce9f6a738cb2b5",
            "sourceName": "B"
        }
    ]
}

根据您尝试做的事情,使用以下查询。

db.collection.find( { "sourceReferenceId.2": {  "$exists": true } } )

db.collection.aggregate([
    { "$match": { "sourceReferenceId.2": {  "$exists": true } } } 
])

答案 1 :(得分:1)

您需要使用 $size 获取 items 数组的大小,使用 $gt 将 items 数组的大小与 0 进行比较。

db.collection.find({"items":{$gt:[{$size:"items"},0]}})

答案 2 :(得分:0)

您可以在$size上使用$ gt。返回字段“items”的长度大于1的所有文档:

db.collection.find({"items": {$gt: {$size: 1}}})