mongodb / node js:在$ init中使用变量不起作用

时间:2013-12-07 13:01:55

标签: javascript node.js mongodb

我有以下内容,我进入了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) ................)

有什么想法吗?

感谢

1 个答案:

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