如果一个收藏中有一条狗的清单,并且在某些种族中有重复的条目。如何仅从一个查询中删除所有内容,但删除一个特定的/非特定的一个?
我想可以从Model.find()获取全部信息,遍历除第一个索引之外的每个索引,然后调用Model.remove(),但我宁愿让数据库通过查询来处理逻辑。这怎么可能?
我想要的伪代码示例:
Model.remove({race:"pitbull"}).where(notFirstOne);
答案 0 :(得分:1)
要删除除一个之外的所有文档,您需要一种方法来获取所有已过滤的文档,将其按标识符分组,为该组创建ID列表,并从中删除单个ID 这个清单。有了此信息,您便可以运行另一个操作以删除具有这些ID的文档。本质上,您将运行两个查询。
第一个查询是一个聚合操作,旨在获取具有潜在核对文档的ID列表:
(async () => {
// Get the duplicate entries minus 1
const [doc, ...rest] = await Module.aggregate([
{ '$match': { 'race': 'pitbull'} },
{ '$group': {
'_id': '$race',
'ids': { '$push': '$_id' },
'id': { '$first': '$_id' }
} },
{ '$project': { 'idsToRemove': { '$setDifference': [ ['$id'], '$ids' ] } } }
]);
const { idsToRemove } = doc;
// Remove the duplicate documents
Module.remove({ '_id': { '$in': idsToRemove } })
})();
答案 1 :(得分:0)
如果目的是仅保留一个,则在并发写入的情况下,最好还是写入
Module.findOne({race:'pitbull'}).select('_id')
//bla
Module.remove({race:'pitbull', _id:{$ne:idReturned}})
如果要保留第一个,则mongodb不能保证结果将通过增加_id进行排序(自然顺序是指磁盘) 参见Does default find() implicitly sort by _id? 所以代替
Module.find({race:'pitbull'}).sort({_id:1}).limit(1)