使用mongodb。我有一系列车辆,每一辆都有一系列事故,每次事故都有一个日期。
Vehicle {
_id: ...,,
GasAMount...,
Type: ...,
Accidents: [
{
Date: ISODate(...),
Type: ..,
Cost: ..
},
{
Date: ISODate(..),
Type: ..,
Cost:...,
}
]
}
如何在不使用骨料的情况下移除每辆车最老的事故? 重要的是不要使用聚合方法。
答案 0 :(得分:0)
不幸的是,在这种情况下你可能不得不使用聚合,因为它几乎不可能找到一个效率很高的非基于聚合的解决方案。 聚合在此处用于获取具有最早日期的嵌入文档。一旦获得它们,就可以更容易地进行更新。以下演示了这个概念,使用MongoDB的 bulk API 来更新您的收藏:
var bulk = db.vehicles.initializeUnorderedBulkOp(),
counter = 0,
pipeline = [
{ "$unwind": "$Accidents" },
{
"$group": {
"_id": "$_id",
"oldestDate": { "$min": "$Accidents.Date" }
}
}
];
var cur = db.vehicles.aggregate(pipeline);
cur.forEach(function (doc){
bulk.find({ "_id": doc._id }).updateOne({
"$pull": { "Accidents": { "Date": doc.oldestDate } }
});
counter++;
if (counter % 100 == 0) {
bulk.execute();
bulk = db.vehicles.initializeUnorderedBulkOp();
}
});
if (counter % 100 != 0) bulk.execute();