0

如果上限集合为空,我试图以原子方式插入一个空文档,如果不为空,则返回最后一个自然排序的文档。我可以用 findAndModify 做到这一点吗?

db.collection.findAndModify({
    query: { _id: { $exists: true }},
    sort: { $natural: -1 },
    update: {},
    upsert: true,
    new: true
});

我本来希望这要么返回最新的文档(如果集合不为空),要么插入一个新文档(如果不存在),但是,它每次调用时都会插入一个空白文档(没有_id)。findAndModify 是否适用于有上限的集合?我需要添加的文档有一个_id.

谢谢。

-斯科特

4

1 回答 1

1

如果上限集合为空,我试图以原子方式插入一个空文档,如果不为空,则返回最后一个自然排序的文档。我可以用 findAndModify 做到这一点吗?

您的查询逻辑存在缺陷。一个 findAndModify() :

query: { _id: { $exists: true }},
sort: { $natural: -1 },
update: {},
upsert: true,
new: true

... 将要:

  • _id使用集合对最后插入的记录进行更新

    或者

  • 如果没有找到带有 an 的现有文档,则插入一个新的(空)文档_id

该更新将用一个空的记录替换您最后插入的记录..这可能不是预期的结果:)。

您看到的是一个完全空的文档(没有_id字段),因为上限集合对标准集合的行为有一些例外。

尤其是:

  • 默认情况下不需要_id字段;您可以通过包含autoIndexId:true选项在服务器上生成一个createCollection()

  • 字段上没有索引_id(注意:如果使用带有上限集合的复制,您需要一个唯一索引)

另请注意,上限集合中的文档不得增长,否则更新将失败

有关更多信息,请参阅wiki 上的Capped Collection Usage & Restrictions 。

于 2012-07-29T14:36:11.567 回答