【问题标题】:mongdb/nodejs: using variables in $inc doesn't workmongodb/node js:在 $init 中使用变量不起作用
【发布时间】:2013-12-24 20:29:00
【问题描述】:

我在 mongo 终端中输入了以下内容,效果很好

db.cars.update({'_id':'FordXdfg'},{$inc :{'attribs.0.totl':1}})

它基本上使用点符号更新数组,0 是数组的索引。

这确实有效。但是将它转移到节点 my 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) ................)

有什么想法吗?

谢谢

【问题讨论】:

标签: javascript node.js mongodb


【解决方案1】:

在 JavaScript 中使用这种类型的对象初始化时,属性名称必须是字符串字面量。使用对象初始化语法时,不能在运行时在代码中构造属性名称。例如,您只能使用如下文字:

{
    "name": "Martin"
    "location": "Earth"
    "value": 1234
}

不能这样做:

var propName = "name";
var obj = {
   propName: "Martin";
};

虽然它在语法上似乎有效,但您最终会得到一个如下所示的对象:

{ 
    propName: "Martin"
}

同样,这是因为在使用缩短语法构造对象时只接受字面值。它不会解释变量值。

还有两个其他选项可以通过简单的点符号来设置 JavaScript 对象的属性:

obj.name = "Martin";

或者,您可以使用括号表示法:

obj["name"] = "Martin";

由于 JavaScript 中的对象的行为类似于关联数组,您可以在运行时定义新的属性/键,每个都有一个值,上述任何一种语法都有效,并且都产生相同的底层存储(并且可以互换使用)。

因此,您需要使用另一种在 JavaScript 中设置对象属性值的技术单独构造 $inc 语法:

var inc = {};
inc["attribs." + carIndx + ".totl"] = 1;

然后在更新中使用它:

{ $inc: inc }

【讨论】:

  • 太好了!你有没有机会解释它为什么起作用?实际的格式看起来很奇怪,但果然数组 = > var carIndx =4; > 变种公司 = {}; > 公司 [“属性。” + carIndx + ".totl"] = 1; 1>公司{“attribs.4.totl”:1}
  • 加了一堆解释。
猜你喜欢
  • 2019-08-24
  • 2018-04-17
  • 2021-12-19
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多