MongoDB:上限集合findAndModify

时间:2012-07-28 16:56:56

标签: mongodb findandmodify

如果封顶集合为空,我试图以原子方式插入空文档,或者如果不为空则返回最后一个自然排序的文档。我可以使用findAndModify吗?

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

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

感谢。

-Scott

1 个答案:

答案 0 :(得分:1)

  

如果有上限,我正试图以原子方式插入空文档   如果收集是空的或返回最后一个自然排序的文档   不是空的。我可以使用findAndModify吗?

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

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

...将:

  • 使用_id设置

    对上次插入的记录进行更新

    或者

  • 如果找不到包含_id的现有文档,则插入新的(空)文档。

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

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

特别是:

  • 默认情况下不需要_id字段;通过将autoIndexId:true选项添加到createCollection()

  • ,您可以在服务器上生成一个
  • _id字段上没有索引(注意:如果使用带有上限集合的复制想要一个唯一索引)< / p>

另请注意,上限集合must not grow in size中的文档或更新将失败

有关详情,请参阅维基上的Capped Collection Usage & Restrictions