猫鼬mongodb-删除所有条件为true的情况,除了一个

时间:2019-01-21 11:39:41

标签: javascript mongodb mongoose

如果一个收藏中有一条狗的清单,并且在某些种族中有重复的条目。如何仅从一个查询中删除所有内容,但删除一个特定的/非特定的一个?

我想可以从Model.find()获取全部信息,遍历除第一个索引之外的每个索引,然后调用Model.remove(),但我宁愿让数据库通过查询来处理逻辑。这怎么可能?

我想要的伪代码示例:

Model.remove({race:"pitbull"}).where(notFirstOne);

2 个答案:

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