从文档中的数组中删除最大值

时间:2015-11-17 19:49:19

标签: mongodb

使用mongodb。我有一系列车辆,每一辆都有一系列事故,每次事故都有一个日期。

Vehicle {
  _id: ...,,
  GasAMount...,
  Type: ...,
  Accidents: [
   {
      Date: ISODate(...),
      Type: ..,
      Cost: ..
   },
   {
      Date: ISODate(..),
      Type: ..,
      Cost:...,
   }
  ]
}

如何在不使用骨料的情况下移除每辆车最老的事故? 重要的是不要使用聚合方法。

1 个答案:

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