如何在mongodb中计算集合中的特定元素



我知道你可以用计算一个集合中有多少元素

 collection.find().count(). 

然而,我想知道如何计算集合中项目中的某个元素。例如,我在Documents中有四个图像,如下所示:

"Documents":{
    "1":"image.png",
    "2":"Test.jpg",
    "3":"Next.png"
  }

我想知道如何计算文档中的所有项目?我试过一些东西,但都不起作用。有人能帮忙吗?

示例数据:

{
  "name": "Oran",
  "username": "Oran.Hammes",
  "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/brandonflatsoda/128.jpg",
  "email": "xxxxxx@hotmail.com",
  "dob": "1953-03-21T17:40:17.020Z",
  "phone": "364-846-1607",
  "address": {
    "street": "Schultz Stream",
    "suite": "Suite 618",
    "city": "North Muriel mouth",
    "zipcode": "06447-1081",
    "geo": {
      "lat": "57.1844",
      "lng": "-56.8890"
    }
  },
  "website": "misty.net",
  "company": {
    "name": "Hettinger, Reilly and Stracke",
    "catchPhrase": "Multi-tiered system-worthy database",
    "bs": "best-of-breed evolve e-markets"
  },
  "Documents": [
    {
        "id": "1",
        "name": "image.png",
    },
    {
        "id": "2",
        "name": "Test.jpg",
    },
    {
         "id": "3",
         "name": "Next.png"
    }
  ]
}

在这个评论之后,我更改了我的文档结构,它看起来像这样:

{
        "_id" : ObjectId("568703d08981f193cf343698"),
        "name" : "Oran",
        "username" : "Oran.Hammes",
        "email" : "xxxxxxx@hotmail.com",
        "dob" : "1953-03-21T17:40:17.020Z",
        "phone" : "364-846-1607",
        "company" : {
                "name" : "Hettinger, Reilly and Stracke",
                "catchPhrase" : "Multi-tiered system-worthy database",
                "bs" : "best-of-breed evolve e-markets"
        },
        "Documents" : [
                {
                        "id" : "1",
                        "name" : "image.png"
                },
                {
                        "id" : "2",
                        "name" : "Test.jpg"
                },
                {
                        "id" : "3",
                        "name" : "Next.png"
                }
        ]
}

一般来说,在文档中使用动态键不是一个好主意。在这种情况下,你最好的选择是mapReduce

var map = function() { 
    emit(this._id, Object.keys(this.Documents).length);
};
var reduce = function(key, values) {};
db.collection.mapReduce(map, reduce, { "out": { "inline": 1 } } )

哪个收益率:

{
        "results" : [
                {
                        "_id" : ObjectId("5686e2a98981f193cf343697"),
                        "value" : 3
                }
        ],
        "timeMillis" : 697,
        "counts" : {
                "input" : 1,
                "emit" : 1,
                "reduce" : 0,
                "output" : 1
        },
        "ok" : 1
}

当然,最好的做法是更改文档结构,使Documents成为子文档的数组,这样Documents字段值看起来像这样:

"Documents": [
    {
        "id": "1",
        "name": "image.png",
    },
    {
        "id": "2",
        "name": "Test.jpg",
    },
    {
         "id": "3",
         "name": "Next.png"
    }
]

使用.aggregate()方法$project您的文档,并使用$size运算符返回"documents"数组中的元素数

db.collections.aggregate([ 
    { "$project": { "count": { "$size": "$Documents" } } } 
] )

相关内容

  • 没有找到相关文章

最新更新