如何在MongoDB中增加具有变量名称的嵌套对象

时间:2014-10-21 18:49:36

标签: javascript mongodb meteor

所以我想'工作'的代码如下。我有一个变量名称作为未读对象的键的名称,这似乎是在MongoDB中执行此操作的唯一方法是在外部创建一个对象并将其作为$ inc的值引用。这似乎不起作用,但如果我只有一个关键的partnerId没有嵌套对象,它确实有效。我的问题是我如何使用嵌套对象。

工作:

var partnerId = 234567;
var action = {
  unread: {}
};
action[partnerId] = 1;

Threads.update(Session.get('currentChat'), 
{
  $inc: action
}, callback);

不起作用,但希望它起作用:

var partnerId = 234567;
var action = {
  unread: {}
};
action.unread[partnerId] = 1;

Threads.update(Session.get('currentChat'), 
{
  $inc: action
}, callback);

我收到的错误是无法增加不是数字的东西,我猜这是指对象中的对象。

我拥有的架构是这样的,123456和234567作为用户ID,我只想增加这个数字:

{
  _id: 123,
  unread: {
    123456: 0,
    234567: 1,
  }
}

1 个答案:

答案 0 :(得分:4)

如果你想以非动态方式写出来,你可以这样做:

var id = Session.get('currentChat');
Threads.update(id, {$inc: {'action.unread.234567': 1}});

$inc需要使用基于partnerId的动态创建的密钥来获取对象,如下所示:

var partnerId = 234567;
var key = 'action.unread.' + partnerId;
var obj = {};
obj[key] = 1;

现在obj看起来像:

{'action.unread.234567': 1}

因此我们可以将其插入您的原始代码中:

Threads.update(id, {$inc: obj}, callback);