Mongoose - 增加嵌套数组中的字段值

时间:2016-11-02 11:56:59

标签: mongodb mongoose mongodb-query mongoose-schema

我是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
    }
]
});

我在这里做错了吗?

感谢您的时间和建议。

1 个答案:

答案 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);
};

其他选项是使用聚合管道并找到该项,然后更新返回的对象。