2016-09-19 95 views
0

所以,我想创建一个小背景。我正在尝试构建一个投票应用程序,其中MongoDb数据库存储了每个选项的选项和计数器,以检查人们为每个选项投了多少次票。我已经实现的数据结构如下所示。如何使用变量字段名称来增加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变量返回一个错误,指出无法找到的未定义的属性字段。变量字段包含指定需要递增1的options_counter对象的特定键的数字。我已将options_counter嵌入原始文档中。我的问题是如何设置语法,以便MongoDb可以找到options_counter对象内的特定键值对来更新,并将该计数器增加1?

+0

有几个问题,但从调用'console.log(fieldToIncrement)'开始显示其值。这可能不是你的想法。 – JohnnyHK

+0

因此,当我使用上述语法来定义fieldToIncrement时,它会返回一个错误,因为我显然试图访问未定义对象的属性。我试着将它改为options_counter.field,但也返回一个错误,因为options_counter不能在数据库之外访问。你看到的其他错误是什么? –

回答

1

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

请分享你的代码,在你定义fieldToIncrement的地方,现在看起来没有定义,同样在你提到的错误中声明:“但是,使用fieldToIncrement变量返回一个错误,说找不到未定义的属性字段。

+0

我在第二块代码的第一行中定义了它。 var fieldToIncrement = db.collection('polls')。options_counter.field; 我尝试了你的建议方法,但是也返回一个错误,因为options_counter只能在db.collection函数内部访问 –

+1

你必须把它改成类似于:var fieldToIncrement = {$ inc:{options_counter.0:1}} 。在更新中使用该变量而不是{inc .....}行。 – HoefMeistert

+0

所以,我做到了。但是,它似乎对文档没有任何影响。文档确实返回,但没有看到更新的效果。 –

相关问题