我是Mongoose和MongoDB的新手,我正在尝试实现一个场景,我必须更新驻留在嵌套数组中的字段值。
例如,我的数据库条目如下:
{
"_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
}
]
});
我在这里做错了吗?
感谢您的时间和建议。
答案 0 :(得分:1)
你没有支持嵌套数组占位符替换的Mongo db限制。位置运算符只能用于一个级别。因此,如果您要更新民意调查中的民意调查问题。$。问题,它将正常工作。此外,mongo db不支持多个占位符,例如民意调查。$。option。$。votes。
如评论中所指出,您可以查看jira缺陷。现在要解决这个问题。
您可以展平您的选项,以便我们可以将其纳入民意调查。这样的事情如下。只要您有问题和选项的唯一ID,您就应该始终可以解析为唯一记录。
{
"_id": ObjectId("581999ecf97860b77c1625f6"), // this is userID
"username": "test",
"__v": 0,
"polls": [{
"url": "xxxx",
"question": "city or united",
"_id": ObjectId("581999ec3ba2b15ad7fbcd50"), //this is questionID
"votes": 0,
"value": "city",
"option_id": ObjectId("581999ec3ba2b15ad7fbcd52") //this is optionID
}, {
"url": "xxxx",
"question": "city or united",
"_id": ObjectId("581999ec3ba2b15ad7fbcd50"), //this is questionID
"votes": 0,
"value": "united",
"option_id": ObjectId("581999ec3ba2b15ad7fbcd51") //this is optionID
}]
}
现在你可以使用这样的东西来增加投票。
PollsSchema.methods.submitVote = function(id, callback) {
var increment = {
$inc: {
'polls.$.votes': 1
}
};
var query = {
'_id': id.userID,
'polls._id': id.questionID,
'polls.option_id': id.optionID
};
return this.model('Poll').update(query, increment, callback);
};
其他选项是使用聚合管道并找到该项,然后更新返回的对象。