Mongoose 的版本锁(version key)存在的意义是什么?是否可以不使用?

2014-05-21 23:57:15 +08:00
 WildCat
4930 次点击
所在节点    Node.js
3 条回复
shuson
2014-05-22 11:03:47 +08:00
versionkey 即使是你不设置,默认也有一个__v作为内部版本的记录: {__v:0}
你可以更改这个__v名字为任意你想要的:new Schema({..}, { versionKey: '_somethingElse' }) 这时候再save这个doc的话就成了{_somethingElse:0}
heroicYang
2014-05-22 11:44:54 +08:00
好吧,我觉得有必要做个简单的阐述。
试想有一个 Post 的 Document:

{ _id: '123456', title: 'hello world', content: 'just for test', comments: [{ author: 'user', content: 'comment1' }, { author: 'heroic', content: 'comment2' }, [{ author: 'another user', content: 'comment1' }] }

恩,接下来我要修改我发表的评论啦:

db.post.update({ _id: '123456' }, { $set: { 'comments.1.content': 'update comment content' } })

看上去好像没问题吧?但是如果第一个发表评论的人在我发表评论之前把评论删除了呢?我岂不是没修改到自己的评论,反而把 `another user` 的给修改了?

如果加上 version key,那我的 update condition 就有保证了:

db.post.update({ _id: '123455', _v: '1' }, { $set: { 'comments.1.content': 'update comment content' } })

如果此时第一个人删了他的评论,那 version key 肯定就不是 1 了,所以会抛出没找到该条文档的错误,这次修改也就不会生效啦。

大致就是这样...
WildCat
2014-05-22 12:15:50 +08:00
@shuson 我知道,但我问的是它存在的意义。


@heroicYang 谢谢。感觉这种场景下,comment可以独立出来成为一个collection,post_id作为它的外键,这种设计感觉更好。
这样看来,__v没必要全局启用了对吧?一般的数据模型还是没这种需求的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX