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)
})
}

postSchema.methods.vote の this.voting.votedFor[voteFor] の値は正しいです。しかし、データベースにクエリを実行すると、古い値になります。それが役立つ場合、2つのファイルでデータベースを使用しており、メソッドが完全に重複していない可能性があります。また、mongoDB GUIでレコードを別の値に変更でき、正常に動作するため、それがmongooseの何かであることも知っています。さらに情報が必要な場合はお知らせください。ありがとう、Porad

4

2 に答える 2

9

{}変更済みとして定義されている、または変更済みとして明示的にマークする必要があるスキーマ内のフィールドは、MixedMongoose が変更されたこと、および 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') (または、両方を 呼び出しperson.markModified('name.last')ます ...しかし、ここでは明らかに劣っているようです)

于 2016-01-11T23:41:21.573 に答える