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

如何在mongodb中计算集合中的特定元素,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,我知道你可以用它来计算一个集合中有多少元素 collection.find().count(). 但是,我想知道如何计算集合中项目中的某个元素。例如,我在文档中有四个图像,如下所示: "Documents":{ "1":"image.png", "2":"Test.jpg", "3":"Next.png" } { "_id" : ObjectId("568703d08981f193cf343698"), "name" : "Or

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

 collection.find().count(). 
但是,我想知道如何计算集合中项目中的某个元素。例如,我在
文档中有四个图像,如下所示:

"Documents":{
    "1":"image.png",
    "2":"Test.jpg",
    "3":"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"
                }
        ]
}
我想知道如何计算文档中的所有项目?我试过几件事,但都不管用。有人能帮忙吗

示例数据:

{
  "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"
    }
  ]
}
在此之后,我更改了文档的结构,其外观如下:

"Documents":{
    "1":"image.png",
    "2":"Test.jpg",
    "3":"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"
                }
        ]
}

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

var map=function(){
emit(this.\u id,Object.keys(this.Documents).length);
};
var reduce=函数(键,值){};
mapReduce(map,reduce,{“out”:{“inline”:1})
这将产生:

{
“结果”:[
{
“_id”:ObjectId(“5686E2A981F193CF343697”),
“价值”:3
}
],
“timeMillis”:697,
“计数”:{
“输入”:1,
“发射”:1,
“减少”:0,
“产出”:1
},
“好”:1
}
显然,最好的做法是更改文档结构,并使
文档
成为子文档数组,以便
文档
字段值如下所示:

"Documents":{
    "1":"image.png",
    "2":"Test.jpg",
    "3":"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"
                }
        ]
}
“文档”:[
{
“id”:“1”,
“名称”:“image.png”,
},
{
“id”:“2”,
“名称”:“Test.jpg”,
},
{
“id”:“3”,
“名称”:“Next.png”
}
]
并使用该方法创建文档,并使用运算符返回“documents”数组中的元素数

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

我尝试了一些方法,但没有一种有效。我想除了
mapReduce
之外,你应该改变你的文档结构,让
Documents
成为一个子文档数组,这样你就可以使用聚合框架了。我同意@user3100115将文档转换成数组的建议。然后可以使用聚合和$sum运算符。@JamesWahlin
$sum
不是这里的正确运算符,因为您不想使用
$unwind
对数组进行非规范化。正确的运算符很抱歉-是的,您是对的$尺寸是你想要的。