【问题标题】:Find and replace a sub sub array element in MongoDB在MongoDB中查找和替换子子数组元素
【发布时间】:2017-04-06 18:29:58
【问题描述】:

您好,我正在开发 MeteorJS 应用程序,我一直在更新子子数组元素。

这是一个投票应用程序,我有以下数据库结构:

在每个问题下都有选项,当用户单击选项的按钮时,我想将该选项投票增加一个,并且每个用户都应该对每个问题拥有一个投票权。

通过按钮,我传递姓名和 questionId 数据,以便找到增加投票的正确选项。我应该找到带有 questionId 的特定问题,然后在 Options 下找到带有名称的特定数组。

我卡在哪里找不到它。

请帮忙,谢谢

集合名称:投票

每个投票都有以下结构:

{
    "_id" : "uJtBt8mM2pbTYfwND",
    "createdAt" : ISODate("2017-04-03T22:40:14.678Z"),
    "pollName" : "First Poll",
    "entryOwner" : "gdAHxDrxFuTvYiFt8",
    "question" : [ 
        {
            "name" : "Question number 1",
            "questionId" : "xgYQxGxpwBXaQpjXN",
            "options" : [ 
                {
                    "name" : "John",
                    "votes" : 0
                }, 
                {
                    "name" : "Adam",
                    "votes" : 0
                }, 
                {
                    "name" : "Robert",
                    "votes" : 0
                }
            ]
        }, 
        {
            "name" : "Question number 2",
            "questionId" : "zviwYHHsaATBdG6Jw",
            "options" : [ 
                {
                    "name" : "John",
                    "votes" : 0
                }, 
                {
                    "name" : "Adam",
                    "votes" : 0
                }, 
                {
                    "name" : "Robert",
                    "votes" : 0
                }
            ]
        }
    ],
}

【问题讨论】:

    标签: arrays mongodb meteor multidimensional-array


    【解决方案1】:

    您可以使用 $and 对包含两个或多个表达式的数组执行逻辑与运算。

    { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
    

    这里的第一个表达式是用 questionId 获取问题。

    'question.questionId': "xgYQxGxpwBXaQpjXN"
    

    第二个表达式在选项数组中指定具有匹配名称的对象。 要在选项数组中查找具有名称的对象,您可以使用 $elemMatch 来指定查询。

    { <field>: { $elemMatch: { <query1>, <query2>, ... } } }
    

    获取选项数组中名称为“John”的对象。

    'question.options': {
        $elemMatch: {
            name: "John"
        }
    }
    

    最后,使用 $inc 来增加投票(这里是 1)。 它将获得第一个匹配的元素(带有 $)。

    'question.options.$.votes': 1
    

    这是完整的代码:

    db.Polls.update({
        $and: [{
                'question.questionId': "xgYQxGxpwBXaQpjXN"
            },
            {
                'question.options': {
                    $elemMatch: {
                        name: "John"
                    }
                }
            }
        ]
    }, {
        $inc: {
            'question.options.$.votes': 1
        }
    })
    

    【讨论】:

    • 在 Stack Overflow 中,仅仅写代码是不够的。请对代码进行注释和解释。
    • 非常感谢您的解释,问题是在运行此代码时它不知道问题的索引因此无法更新投票。我已经通过安装 underscore.js 库并在单击按钮时查找每个项目索引来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多