如何在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
对数组进行非规范化。正确的运算符很抱歉-是的,您是对的$尺寸是你想要的。