【问题标题】:New version when updating an entry using mongoose and mongoose-version使用 mongoose 和 mongoose-version 更新条目时的新版本
【发布时间】:2014-05-16 00:50:12
【问题描述】:

我正在尝试使用 mongoose 跟踪 mongo 数据库中某些文档的所有修订。出于这个原因,我决定使用插件 mongoose-version。

当我创建一个新文档并将其添加到数据库时,我可以看到一个版本保存在存储不同版本的集合中。但是,当我用新文档更新文档时,我可以看到存储文档(最新版本)的集合中所做的更改,但看不到存储在版本化数据库中的新版本。任何线索为什么会发生这种情况?

这是我的架构:

var userSchema = new mongoose.Schema({
    name      : String,
    username  : { 'type': String, 'unique': true },
    email     : { 'type': String, 'unique': true },
    createdOn : { 'type': Date, 'default': Date.now },
    modifiedOn: { 'type': Date, 'default': Date.now }
});

mongoose.model('User', userSchema, 'users');

// Versioning options
var userVersioningOptions = {
    collection: 'versionedUsers',
    logError: true,
    suppressVersionIncrement: true,     // default value
    strategy: 'array',
    removeVersions: false               // default value
};

userSchema.plugin(version, userVersioningOptions);

这就是我创建用户的方式:

User.create({
    name      : request.body.FullName,
    username  : request.body.UserName,
    email     : request.body.Email,
    modifiedOn: Date.now()
}, function (err, user) {
    if (err) {
        console.log(err);
        if (err.code === 11000) {
            response.redirect('/users/new?exists=true');
        }
        else {
            response.send("Error while creating new user. The error code was " + err.code + " and the entire error " + err);
            //response.redirect('users/new?error=true');
        }
    }
    else {
        console.log("User created and saved: " + user);
        response.redirect('/users/' + user.username);
    }
});

这就是我更新用户详细信息的方式(本质上只有名称可以更改,但在我学习时仅用于演示目的)。

User.update(
    {username: newDetails.username},
    {$set: {name: newDetails.name, modifiedOn: Date.now()}},
    {upsert: false, multi: true},
    function (err, numAffected) {
        if (err)
            throw err;
        console.log("The error was " + err);
        console.log("Updated " + numAffected + " documents");
        response.send({}, 200);
    }
);

任何帮助或提示将不胜感激,因为我也是使用 mongo 和 mongoose 的新手。

【问题讨论】:

  • 这个运气好吗?
  • 是的。我按照一开始的意图使用集合进行了自己的版本控制。首先,我在要版本化的集合的文档中添加了一个属性_revision。然后在我的代码中,每次我想将新版本写入数据库时​​,我都会将此值增加 1。然后,基本上我克隆了 repo,并稍微修改/添加了 collection.js 文件中的代码(大约 4-5 行代码)。诀窍是创建一个克隆模式,使对象 id 是随机的(默认),并通过 _revision 属性引用适当的版本。
  • 因此,克隆的模式几乎是我正在保存的文档的最新版本的副本。因此,由于我没有修改内容,我只是在复制,所以没有我需要小心或处理的真正问题。我也做了这里建议的改变:github.com/saintedlama/mongoose-version/issues/9
  • 如果所有这些听起来都太模糊,请告诉我,我可以尝试编译一个更有意义的答案并将其发布为问题的实际答案。

标签: node.js mongoose database-versioning mongoose-plugins


【解决方案1】:

mongoose-version 目前不支持更新 (https://github.com/saintedlama/mongoose-version/issues/25)。原因是由于猫鼬保存与更新的性质(没有钩子)。我相信 mongoose 现在有更新的钩子,但 mongoose-version 尚未为此更新。

您可能会考虑的另一种方法是保存所有 oplog。取决于您的用例,但这可能是最容易设置/维护的,并且缺少更改的边缘情况应该少得多。

我不能相信这个建议。来自:http://www.askasya.com/post/bestversion/

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 2018-12-22
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多