2

使用猫鼬我正在做:

var postSchecma = mongoose.Schema({
title: String,
body: String,
link: String,
voting: {
    has: {
        type: Boolean,
    default:
        false
    },
    canVoteFor: [mongoose.Schema.Types.Mixed],
    votedFor:{},
    voteDates:{}
},
comments: [mongoose.Schema.Types.Mixed],
date: {
    type: mongoose.Schema.Types.Mixed,
default:
    new Date().getTime()
}
}, {
    strict: false,
    safe:true
})

postSchecma.methods.vote = function(voteFor, callback) {
var self = this;
if(self.voting.canVoteFor.indexOf(voteFor) < 0) {
    callback(new Error('Error: Invalid Thing To Vote For'));
    return;
}
this.voting.voteDates[voteFor].push(new Date().getTime())
this.voting.votedFor[voteFor]++
s = this;
this.save(function(err) {
    if(err) {
        callback(err)
    }
    console.log(err);
    console.log("this:"+ s);
    callback(s)
})
}

在 postSchecma.methods.vote 中 this.voting.votedFor[voteFor] 的值是正确的。但是当我查询数据库时,它是旧值。如果它有帮助,我在 2 个文件中使用 db,并且这些方法可能不是完全重复的。我也知道它与猫鼬有关,因为我可以使用 mongoDB GUI 将记录更改为不同的值,并且效果很好。如果您需要更多信息,请告诉我,谢谢,Porad

4

2 回答 2

9

架构中定义为{}Mixed必须明确标记为已修改的任何字段,否则 Mongoose 将不知道它已更改并且 Mongoose 需要保存它。

在这种情况下,您需要在 之前添加以下内容save

this.markModified('voting.voteDates');
this.markModified('voting.votedFor');

请参阅Mixed 此处的文档。

于 2013-01-04T03:15:31.127 回答
0

事实证明,这有时也适用于非Mixed物品,正如我痛苦地发现的那样。如果您重新分配整个子对象,您也需要在markModified那里使用。至少……有时。我没有用得到这个错误,然后我做了,没有更改任何相关代码。我的猜测是这是猫鼬版本的升级。

例子!说你有...

personSchema = mongoose.Schema({
    name: {
        first: String,
        last: String
    }
});

...然后你打电话给...

Person.findById('whatever', function (err, person) {
    person.name = {first: 'Malcolm', last: 'Ocean'};
    person.save(function (err2) {
        // person.name will be as it was set, but this won't persist
        // to the database
    });
});

person.markModified('name')...除非您之前打电话,否则您将度过一段糟糕的时光save

(或者,同时调用person.markModified('name.first') and person.markModified('name.last') ...但这似乎明显逊色)

于 2016-01-11T23:41:21.573 回答