如何在数组Mongodb findAndModify中访问对象中的值

时间:2016-02-23 05:12:28

标签: arrays mongodb mongodb-query

如何更新数组内对象内的值。我将在变量中提供确切的数组编号...继承我的代码:

var num = 0;
var ObjectID=require('mongodb').ObjectID;

db.collection('polls').findAndModify({
    query: {_id: ObjectID(_id param)},
    update: { $inc: { total: 1, "Data.chart." + num.toString + ".value": 1} }
});

这就是我想要更新的内容

{total: 0, "Data": [ 
  { value: 0, label: 'Beatles', color: '#4169E1' },
  { value: 0, label: 'Sting', color: '#C0C0C0' },
  { value: 0, label: 'Police', color: '#FFA500' },
  { value: 0, label: 'Journey', color: '#FF4500' },
  { value: 0, label: 'Genesis', color: '#EE82EE' } 
  ]
}

2 个答案:

答案 0 :(得分:1)

您似乎在查询中有一个小节chart,在要更新的实际数据中不存在。只是消除它;

db.collection('polls').findAndModify({
    query: {_id: ObjectID(_id param)},
    update: { $inc: { total: 1, "Data." + num.toString + ".value": 1} }
});

将查询转换为

db.polls.update({}, { $inc: { total: 1, "Data.2.value": 1} })

导致

db.polls.find().pretty()
{
    "_id" : ObjectId("56cbebb6ef788d178e2dfdc0"),
    "total" : 1,
    "Data" : [
        ...
        {
            "value" : 1,
            "label" : "Police",
            "color" : "#FFA500"
        },
        ...

答案 1 :(得分:0)

JavaScript"字符串化"提供钥匙,所以这就是为什么你没有得到你期望的。

将变量用作"计算出的密钥名称的一部分"您需要使用括号[]表示法来定义对象:

var num = 0;

var update = { "$inc": { "total": 1 } };

update["$inc"]["Data." + num + ".value"] = 1;

db.collection('polls').findAndModify({
    query: { _id: ObjectID(_id param) },
    update: update
});

更好的是,你不应该假设"索引"您认为要修改的是数据的实际位置。而是匹配查询中的数组元素并使用位置$运算符而不是硬索引:

db.collection('polls').findAndModify({
    query: { "_id": ObjectID(_idParam), "Data.label": 'Beatles'   },
    update: { "$inc": { "total": 1, "Data.$.value": 1 } }
});

因此,将Data.label"Beatles"匹配的元素将是更新的元素,而不管数组中当前的索引位置如何。

这意味着"可扩展",其他写入可能会改变阵列内容,但您仍在更新所需的内容,即使它因为另一次更新而改变了位置。

N.B 您问题中的文档的数组元素路径为Data而不是Data.chart。但是,但是应用你的真实数据是构建的。