V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WildCat
V2EX  ›  Node.js

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

  •  
  •   WildCat · 2014-05-21 23:57:15 +08:00 via iPhone · 4923 次点击
    这是一个创建于 3622 天前的主题,其中的信息可能已经有所发展或是发生改变。
    3 条回复    2014-05-22 12:15:50 +08:00
    shuson
        1
    shuson  
       2014-05-22 11:03:47 +08:00
    versionkey 即使是你不设置,默认也有一个__v作为内部版本的记录: {__v:0}
    你可以更改这个__v名字为任意你想要的:new Schema({..}, { versionKey: '_somethingElse' }) 这时候再save这个doc的话就成了{_somethingElse:0}
    heroicYang
        2
    heroicYang  
       2014-05-22 11:44:54 +08:00   ❤️ 2
    好吧,我觉得有必要做个简单的阐述。
    试想有一个 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
        3
    WildCat  
    OP
       2014-05-22 12:15:50 +08:00 via iPhone
    @shuson 我知道,但我问的是它存在的意义。


    @heroicYang 谢谢。感觉这种场景下,comment可以独立出来成为一个collection,post_id作为它的外键,这种设计感觉更好。
    这样看来,__v没必要全局启用了对吧?一般的数据模型还是没这种需求的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2355 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:07 · PVG 00:07 · LAX 09:07 · JFK 12:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.