我有一个包含大量数据的MongoDB集合。
我的JSON文档的一部分如下所示:
{
"_id":{
"$oid":"5364e0867a2690e2a2be13ff"
},
"share_name":"test123",
"data_objects":[
{
"user":"The Flying Pirate.",
"location":"Devon, UK.",
"share_id":462568869077716992
},
{
"user":"The Dragon.",
"location":"London, UK.",
"share_id":462568869077716992
},
{
"user":"lozzien",
"location":"Miami, USA.",
"share_id":462568869077716992
}
]
}
如您所见,单个文档可以包含data_object列表。上述文档有3个数据对象。我需要获取此集合中数据对象的总数。我怎样才能得到这个总数?
答案 0 :(得分:0)
你基本上是在"总结"文档中包含的数组元素的总长度。
使用MongoDB 2.6,这要归功于$size
运算符:
db.collection.aggregate([
{ "$group": {
"_id": null,
"totalSize": { "$sum": { "$size": "data_objects" } }
}}
])
在以前的版本中,您将需要其他方法来获取数组" size"。值得注意的是$unwind
运营商:
db.collection.aggregate([
{ "$unwind": "$data_objects" },
{ "$group": {
"_id": null,
"totalSize": { "$sum": 1 }
}}
])
由于阵列内容现在已经过去标准化,并且#34;它只是计算总条目的问题。因此,对于集合中的每个展开文档,$sum
1。
为Java驱动程序编写这个并不难:
DBObject group = new BasicDBObject(
"$group", new BasicDBObject(
"_id",null
).append(
"totalSize", new BasicDBObject(
"$sum", new BasicDBObject(
"$size", "data_objects"
)
)
)
);
db.getCollection("collection").aggregate(Arrays.asList(group));
理想情况下,您应该考虑"存储"文档中的数组长度。这对"查询"非常有用。目的并且无需计算这个"在飞行中#34;。使用$inc
运算符以及$push
和$pull
处理添加内容:
用于向数组添加数据:
db.collection.update(
{ "_id": Objectid("5364e0867a2690e2a2be13ff") },
{
"$push": { "data_objects": newObject },
"$inc": { "data_count": 1 }
}
)
删除:
db.collection.update(
{ "_id": Objectid("5364e0867a2690e2a2be13ff") },
{
"$pull": { "data_objects": removeReqery },
"$inc": { "data_count": -1 }
}
)
然后,您始终在执行相同的聚合:
db.collection.aggregate([
{ "$group": {
"_id": null,
"totalSize": { "$sum": "$data_count" }
}}
])