如何在 MongoDB 中使用变量名增加嵌套对象

Jef*_*Lau 1 javascript mongodb meteor

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

是否有效:

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

Threads.update(Session.get('currentChat'), 
{
  $inc: action
}, callback);
Run Code Online (Sandbox Code Playgroud)

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

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

Threads.update(Session.get('currentChat'), 
{
  $inc: action
}, callback);
Run Code Online (Sandbox Code Playgroud)

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

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

{
  _id: 123,
  unread: {
    123456: 0,
    234567: 1,
  }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*don 5

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

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

$inc需要使用基于动态创建的键的对象,partnerId如下所示:

var partnerId = 234567;
var key = 'action.unread.' + partnerId;
var obj = {};
obj[key] = 1;
Run Code Online (Sandbox Code Playgroud)

现在obj看起来像:

{'action.unread.234567': 1}
Run Code Online (Sandbox Code Playgroud)

所以我们可以把它插入你的原始代码中:

Threads.update(id, {$inc: obj}, callback);
Run Code Online (Sandbox Code Playgroud)

  • `$inc` 接受一个对象,其键是要递增的字段,其值是数字。你想要增加的字段是'action.unread.234567',所以它需要是一个字符串。在您的示例中,`action` 是 `{unread: {'234567': 1}}`。因此,将它与 `$inc` 一起使用就像在说:“请将 `unread` 增加值 `{'234567': 1}`”,这对数据库没有意义。我希望这有帮助。:) (2认同)