【问题标题】:How to increment mongodb fields using variable field name?如何使用变量字段名称增加 mongodb 字段?
【发布时间】:2016-09-19 14:08:36
【问题描述】:

所以,关于我正在尝试创建的内容的一些背景知识。我正在尝试构建一个投票应用程序,其中 MongoDb 数据库存储选项和每个选项的计数器,以检查人们为每个选项投票的次数。我实现的数据结构如下所示。

_id:"57dfecfa3832360f46e183c2"
options:"iea, aoegboae, aoeugoa, ougr, gege"
options_counter:Object
0:0
1:0
2:0
3:0
4:0
__proto__:Object
title:"hr"

每个数字 [0,1,2,3,4] 代表一个选项,冒号后面的数字代表每个选项的计数器。我更新所需计数器的功能如下所示

   var fieldToIncrement = db.collection('polls').options_counter.field;
        db.collection('polls').findOneAndUpdate(
            {_id: user_id},
            {$inc: {fieldToIncrement: 1}}, 
            {upsert:false}, 
            {returnNewDocument: true}
        ).toArray(function(err, doc){
           if(err){
               throw new Error(err);
           }if(doc){
               console.log(doc);
               //callback(null, doc);
           }
        });

但是,使用 fieldToIncrement 变量会返回一个错误,提示找不到未定义的属性字段。变量字段包含指定 options_counter 对象的特定键的数字,该对象需要递增 1。我已将 options_counter 嵌入到原始文档中。我的问题是如何设置语法,以便 MongoDb 可以在 options_counter 对象中找到要更新的特定键值对,并将该计数器增加 1?

【问题讨论】:

  • 有几个问题,但首先要调用console.log(fieldToIncrement) 来显示它的价值。它可能不是你想的那样。
  • 因此,当我使用上述语法定义 fieldToIncrement 时,它会返回错误,因为我显然是在尝试访问未定义对象的属性。我尝试将其更改为仅 options_counter.field,但这也会返回错误,因为无法在数据库外部访问 options_counter。您看到的其他错误是什么?

标签: javascript node.js mongodb database


【解决方案1】:

看起来“options_counter”是一个嵌入式文档,为此您的 var fieldToIncrement 必须类似于 options_count.0。 我在你的问题中看不到这一点。

请分享您定义 fieldToIncrement 的代码,现在似乎未定义,正如您提到的错误中所述:“但是,使用 fieldToIncrement 变量返回错误,提示找不到未定义的属性字段。”

【讨论】:

  • 我在第二个代码块的第一行定义了它。 var fieldToIncrement = db.collection('polls').options_counter.field;我尝试了您建议的方法,但也返回错误,因为 options_counter 只能在 db.collection 函数中访问
  • 您必须将其更改为:var fieldToIncrement = { $inc :{ options_counter.0 :1}}。在更新中使用该 var 而不是 {inc .....} 行。
  • 所以,我做到了。但是,它似乎对文档没有任何影响。该文档确实被返回,但没有看到更新的任何效果。
  • @ZaidHumayun 我不知道您模型的布局,所以我猜 options_counter.0 为 0 使用嵌入文档中的 var。如果不清楚,请告诉我,我们将开始讨论
  • 嘿,我知道出了什么问题。它与我的代码中的错误关系不大,而与 MongoDb 关于如何返回更新后的文档的随意文档有关。顺便说一句,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
相关资源
最近更新 更多