如果封顶集合为空,我试图以原子方式插入空文档,或者如果不为空则返回最后一个自然排序的文档。我可以使用findAndModify吗?
db.collection.findAndModify({
query: { _id: { $exists: true }},
sort: { $natural: -1 },
update: {},
upsert: true,
new: true
});
我原本希望这可以返回最新文档(如果集合非空)或插入新文档(如果不存在),但是,每次调用它都会插入一个空文档(没有_id)。 findAndModify是否适用于上限集合?我需要添加的文档有_id
。
感谢。
-Scott
答案 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。