当前位置: 首页 > 知识库问答 >
问题:

如何删除mongo中除了最近的所有文档?[已解决]

陆英毅
2023-03-14

我收集了一些注册过的数据

{ _id: 0000120210903, iid: 00001, date: 20210903 }, { _id: 0000220210903, IID: 00002, date: 20210903 }, { _id: 0000120210101, IID: 00001, date: 20210101 }

我想删除除每个iid的最新日期的文档之外的所有文档。

我的想法是按日期分组,用最大值(日期)选择寄存器的_id,然后删除除此_id数组之外的所有。但我不知道该怎么做。

db.getCollection('testing_data').aggregate(
    { $sort:{ _id:1 }},
    { $group:{
         _id:"$iid",
         lastId:{ "$last":"$_id" },
    }},
    { $project:{ _id: 0, lastId: 1 } }
)

但我不知道从这里走到哪里。非常感谢任何帮助。

[解决方案]

为了解决这个问题,我使用聚合来恢复字段 iid(文档之间共享的标识符)和唯一_id作为数组的组合。

然后,对于数组上的每个元素,它在 iid 上执行 deleteMany 操作,但释放最近的_id。在这种情况下,我按_id排序,因为它包括日期,但也可以按字段日期排序。

由于数据量很大,必须将其放在聚合中。

var ids = db.getCollection('testing_data').aggregate([
    { $sort:{ _id:1 }},
    { $group:{
         _id:"$iid",
         lastId:{ "$last":"$_id" },
    }},
    { $project:{ _id: 1, lastId: 1 } }
], { allowDiskUse: true } ).toArray();

ids.forEach(function(x){
    db.getCollection('testing_data').deleteMany({ "iid": x._id, "_id": {$ne:x.lastId} })
});

共有2个答案

万俟高峻
2023-03-14

[解决方案]

为了解决这个问题,我使用聚合来恢复字段 iid(文档之间共享的标识符)和唯一_id作为数组的组合。

然后,对于数组上的每个元素,它在 iid 上执行 deleteMany 操作,但释放最近的_id。在这种情况下,我按_id排序,因为它包括日期,但也可以按字段日期排序

由于数据量很大,必须将其放在聚合中。

var ids = db.getCollection('testing_data').aggregate([
    { $sort:{ _id:1 }},
    { $group:{
         _id:"$iid",
         lastId:{ "$last":"$_id" },
    }},
    { $project:{ _id: 1, lastId: 1 } }
], { allowDiskUse: true } ).toArray();

ids.forEach(function(x){
    db.getCollection('testing_data').deleteMany({ "iid": x._id, "_id": {$ne:x.lastId} })
});
宋子辰
2023-03-14

我的想法只是将所有_id存储在您要删除的某个数组中,然后使用delete的$或过滤器

db.getCollection("testing_data").find({}).toArray((err,data)=>{
  let to_elim = [];
  let filtering ={};
  for(let el of data){
    if(!filtering[el.iid]) filtering[el.iid] = el;
    else {
      if(filtering[el.iid].date>el.date) to_elim.push({_id:new ObjectID(el._id)})
    }
  }
  db.getCollection("testing_data").deleteMany({$or:to_elim})
})

我希望一切都写正确,因为把所有这些都写在手机上

缺少一些检查是否有更新的。。。

 类似资料:
  • 问题内容: 我有一对多关系的两个数据库表。数据如下所示: 结果集: 我想删除所有应用程序,但最新的除外。换句话说,每个学生都只能将一个应用程序链接到该应用程序。使用上面的示例,数据应如下所示: 我将如何构造我的DELETE语句以过滤出正确的记录? 问题答案: 考虑到评论中的长时间讨论,请注意以下几点: 上面的语句 将 在任何正确实现语句级读取一致性的数据库上运行,而不管语句运行时对表的任何更改。

  • 问题内容: 我正在寻找清除整个收藏夹的方法。我看到有一个批处理更新选项,但这需要我知道集合中的所有文档ID。 我正在寻找一种简单地删除集合中每个文档的方法。 谢谢! 编辑:下面的答案是正确的,我使用以下方法: 问题答案: 没有API可以一次性删除整个集合(或其内容)。 从Firestore文档中: 要在Cloud Firestore中删除整个集合或子集合,请检索集合或子集合中的所有文档并将其删除。

  • 据我所知,我可以使用云函数以某种方式实现这一点?我试着阅读云函数,但我很迷路。是否有一种方法可以触发云函数,在用户更新帖子时删除子集合中的所有文档?

  • 问题内容: 我正在尝试从猫鼬文档中存储的集合中删除一项。我的文档如下所示: 我想删除SKU为12的金鱼。我正在执行以下操作: 当我这样做时,出现错误“ TypeError:无法读取未定义的属性’等于’”。我不明白为什么。 问题答案: 您需要,然后打个电话。用于顶级文档

  • 我知道如何。。。 删除单个文档。 但我不知道如何删除Mongoose收藏中的所有文档。我想在用户单击按钮时执行此操作。我假设我需要向某个endpoint发送AJAX请求并让该endpoint进行删除,但我不知道如何在endpoint处处理删除。 在我的例子中,我有一个集合,我想在用户单击按钮时删除所有文档。 api/datetime/index.js API/datetime/datetime.c

  • 我正在尝试用大量新值替换所有文档。 例如,我们在数据库中500k文档,并且我们500k了相同的文档,其中包含更新的道具。现在我们需要更新旧数据。 想法是在新集合中使用InsertMany with lean选项,然后删除旧集合以减少读/写次数。 问题是,对于这种情况,有没有更简单的方法? 在这种情况下,也许连进出口都更好? PS模型。updateMany()有一个过滤器,我们这里不需要过滤器,因为