Javascript Mongodb:子文档数组上的聚合值
我收集了以下文件:Javascript Mongodb:子文档数组上的聚合值,javascript,mongodb,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongodb Query,Aggregation Framework,我收集了以下文件: { "_id": ObjectId("55dc62647cda24224372e308"), "last_modified": ISODate("2015-07-01T15:57:26.874Z"), "services": [ {"last_modified": ISODate("2015-05-08T07:10:11.250Z")}, {...} ] } 我需要通过查找文档服务的max last_updat
{
"_id": ObjectId("55dc62647cda24224372e308"),
"last_modified": ISODate("2015-07-01T15:57:26.874Z"),
"services": [
{"last_modified": ISODate("2015-05-08T07:10:11.250Z")},
{...}
]
}
我需要通过查找文档服务的max last_updated值来刷新文档的last_modified字段:
>db.documents.find().map(function(d){
db.documents.update(
{_id: d._id},
{$set: {last_updated: Math.max(d.services.last_updated)}}
)
})
Tue Aug 25 16:01:20.536 TypeError: Cannot read property 'last_modified' of undefined
如何访问和聚合数组中子文档的属性?这里的基本过程是需要从数组中获取最大排序日期并从中获取值。当然,您需要一个循环,并且不能在update语句中直接访问文档的值。因此,您需要先阅读它,但这里有操作帮助:
var bulk=db.documents.initializeOrderedBulkOp(),
计数=0;
db.documents.find().forEach(函数(doc){
var last_modified=doc.services.sort(函数(a,b){
返回a.last\u modified
更好的是,考虑在添加新项目时对数组本身进行排序。这基本上是通过修改器来完成的
db.documents.update(
{u id:id},
{“$push”:{
“服务”:{
“$each”:[{“last_modified”:date}],
“$sort”:{“上次修改”:1}
}}
)
或者甚至忘记了$sort
,因为所有数组值都会附加到末尾,除非您告诉操作不要这样做
然后,您可以使用基本缩短程序
var bulk=db.documents.initializeOrderedBulkOp(),
计数=0;
db.documents.find(
{},
{
“上次修改”:{“$slice”:-1}
}
).forEach(功能(文档){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$set”:{“last_modified”:doc.last_modified[0]}
});
计数++;
如果(计数%1000==0){
bulk.execute();
bulk=db.documents.initializeOrderedBulkOp();
}
});
如果(计数%1000!=0)
bulk.execute();
这里可以使用聚合框架,但考虑到只从每个文档的对象中获取最大日期值是多么简单,聚合框架实际上是不必要的
var bulk=db.documents.initializeOrderedBulkOp(),
计数=0;
db.documents.aggregate([
{“$unwind”:“$services”},
{“$组”:{
“\u id”:“$\u id”,
“last_modified”:{“$max”:“$services.last_modified”}
}}
]).forEach(功能(文档){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$set”:{“last_modified”:doc.last_modified}
});
计数++;
如果(计数%1000==0){
bulk.execute();
bulk=db.documents.initializeOrderedBulkOp();
}
});
如果(计数%1000!=0)
bulk.execute();
而且,由于使用这种方法,实际成本远远高于必要成本。本不应关闭,因为这里的大部分要点是“如何从数组中获取最大值”并且没有引用另一个属性。这个问题显然与前一个属性的方法不正确。这个问题的主要目的是如何在文档中聚合对象数组的值。即使没有答案,我也没有发现这样的问题。同意。不幸的是,这里的一位金章成员滥用了他们的权限,没有阅读您的问题。您愿意吗我很乐意告诉你如何正确地进行投票,但是对问题的保留会阻止进一步的回答。只要交叉手指,希望重新开放的投票比在这里进行保留的用户显示出更多的智慧。