我有以下内容,我进入了mongo终端,它运作良好
db.cars.update({'_id':'FordXdfg'},{$inc :{'attribs.0.totl':1}})
基本上使用点表示法更新数组,0是数组的索引。
这确实有效。但是将它转移到节点我的0来自一个变量。
所以我试过
var carIndex = 3;
cars.update({'_id':'FordXdfg'},{$inc :{'attribs.' + carIndex + '.totl':1}}, function (err, callback) ................)
似乎是无效的javascript,如果我用3替换我的carIndex然后它工作,即
cars.update({'_id':'FordXdfg'},{$inc :{'attribs.3.totl':1}}, function (err, callback) ................)
有什么想法吗?
感谢
答案 0 :(得分:2)
在JavaScript中使用该样式的对象初始化时,属性名称必须是字符串文字。使用对象初始化语法时,无法在代码中的运行时构造属性名称。例如,您只能使用以下文字:
{
"name": "Martin"
"location": "Earth"
"value": 1234
}
你不能这样做:
var propName = "name";
var obj = {
propName: "Martin";
};
虽然它在语法上似乎有用,但你最终会得到一个看似如下的对象:
{
propName: "Martin"
}
同样,这是因为在使用缩短的语法构造对象时只接受文字值。它不会解释变量值。
通过简单的点符号设置JavaScript对象的属性还有另外两个选项:
obj.name = "Martin";
或者,您可以使用括号表示法:
obj["name"] = "Martin";
由于JavaScript中的对象就像关联数组一样,你可以在运行时使用一个值定义新的属性/键,上面的语法都可以工作,并且两者都会产生相同的底层存储(并且可以互换使用)。 p>
因此,您需要使用另一种在JavaScript中设置对象属性值的技术单独构造$inc
语法:
var inc = {};
inc["attribs." + carIndx + ".totl"] = 1;
然后在更新中使用它:
{ $inc: inc }