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

camsedfj  于 2022-10-22  发布在  Go
关注(0)|答案(5)|浏览(173)

我有一份像这样的文件

{
    "_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 }
         }
    }
   ]
)

这并不像预期的那样工作,它提供的文档甚至只有一个来源参考ID。有人能告诉我我哪里错了吗?

sigwle7e

sigwle7e1#

您需要使用点符号和$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 } } } 
])
9q78igpj

9q78igpj2#

以下是查询的使用方式:

db.<collection>.find( {<column> : {$exists:true}, $where:'this.<column>.length > 1'})

<collection>:您的收藏
<column>:您的列的名称

dffbzjpn

dffbzjpn3#

您可以将$expr$size一起使用。

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

jgovgodb4#

您可以将$gt与$size一起使用。返回字段“Items”的长度大于1的所有文档:

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

eqqqjvef5#

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

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

相关问题