排序和Mongoose.js的findOneAndRemove

3
根据 Mongoose.js 文档,可以在直接传递给数据库的方法中添加排序指令,例如 findOneAndUpdatefindOneAndRemove
我想获取符合条件的单个文档并将其从数据库中删除。到目前为止,我尝试过:
Model.findOneAndRemove({foo: 'bar'})
    .sort({created_at: 'asc'})
    .exec(callback);

并且

Model.findOneAndRemove({foo: 'bar'}, {sort: {created_at: 'asc'}}).exec(callback);

这两种方法似乎都忽略了排序指令,只是找到并删除最近添加的匹配文档,而不是创建时间最早的文档。

将查询发出作为findOne,然后在回调函数中删除文档可以按预期工作,例如:

Model.findOne({foo: 'bar'}).sort({created_at: 'asc'})
    .exec(function (err, doc) { 
        doc.remove(); 
    });

findOneAndRemove 方法返回并删除创建时间最早的文档,因此我认为在 findOneAndRemove 查询中进行排序(与普通查询不同,会直接传递给 MongoDB)必须使用不同的语法。

使用 findOne 而不是 findOneAndRemove 是一个可行的选择,但如果可能的话,我更喜欢这个操作是原子的。

是否可以在 Mongoose.js 的查询中像 findOneAndUpdatefindOneAndRemove 一样使用排序指令,如果可以,语法是什么?


2
对我来说似乎是个bug,就像你所说的,mongoose文档说可以这样做,但我无法使其工作。看看能否提交一个bug或发送电子邮件给mongoose团队。 - Mattias Farnemyhr
2个回答

0

也许将排序条件更改为以下内容会有所帮助:

    {created_at: 1}

'或'

    {created_at: -1}

(分别为升序或降序)。我目前也在苦苦挣扎findOneAndRemove包装器。它似乎不能完美地工作。


0
根据此处的API文档,这个问题在mongoose.js的v3.8.18版本中已经被修复。
很可能早些版本就已经修复了,但我正在使用的是这个版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接