私はMongooseとMongoDBを使い慣れており、ネストされた配列に存在するフィールド値を更新する必要があるシナリオを実装しようとしています。例えばMongoose - ネストされた配列のフィールド値をインクリメント
次のように、私のDBエントリは次のとおりです。
{
"_id" : ObjectId("581999ecf97860b77c1625f6"), // this is userID
"username" : "test",
"__v" : 0,
"polls" : [
{
"url" : "xxxx",
"question" : "city or united",
"_id" : ObjectId("581999ec3ba2b15ad7fbcd50"), //this is questionID
"option" : [
{
"votes" : 0,
"value" : "city",
"_id" : ObjectId("581999ec3ba2b15ad7fbcd52") //this is optionID
},
{
"votes" : 0,
"value" : "united",
"_id" : ObjectId("581999ec3ba2b15ad7fbcd51") //this is optionID
}
]
},
{
"url" : "yyyy",
"question" : "chelsea or arsenal",
"_id" : ObjectId("58199d0ef11835685d3f41b7"),
"option" : [
{
"votes" : 0,
"value" : "chelsea",
"_id" : ObjectId("58199d0ef11835685d3f41b9")
},
{
"votes" : 0,
"value" : "arsenal",
"_id" : ObjectId("58199d0ef11835685d3f41b8")
}
]
}
]
}
私はそれは、フロントエンドから選択されるたびに、特定のオプションの票をインクリメントする必要があります。
以下は、これまで実装しようとしてきたものの、成功しなかったものです。以下は
PollsSchema.methods.submitVote = function(id, callback){
var increment = { $inc: { 'polls.option.$.votes': 1 } };
var query = {
'_id': id.userID,
'polls._id': id.questionID,
'polls.option._id': id.optionID
};
return this.model('Poll').update(query, increment, callback);
};
私のスキーマです:
var PollsSchema = new Schema({
username: String,
polls: [
{
question: String,
option: [
{
value: String,
votes: Number
}
],
url: String
}
]
});
は、私はこっち間違ってやっているものはありますか?
お時間をありがとうございます。
MongoDBの既知の問題です。既に開いているバグがあります。https://jira.mongodb.org/browse/SERVER-831 –
[Mongoの2レベル階層でポジショナル演算子を使用する]の可能な複製(http://stackoverflow.com/questions/5038983/ 2レベル階層を使用したポジションオペレータ使用) –