Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongodb:子文档数组上的聚合值_Javascript_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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();

而且,由于使用这种方法,实际成本远远高于必要成本。

本不应关闭,因为这里的大部分要点是“如何从数组中获取最大值”并且没有引用另一个属性。这个问题显然与前一个属性的方法不正确。这个问题的主要目的是如何在文档中聚合对象数组的值。即使没有答案,我也没有发现这样的问题。同意。不幸的是,这里的一位金章成员滥用了他们的权限,没有阅读您的问题。您愿意吗我很乐意告诉你如何正确地进行投票,但是对问题的保留会阻止进一步的回答。只要交叉手指,希望重新开放的投票比在这里进行保留的用户显示出更多的智慧。