需要在 Mongoskin 请求中 "build" 一个 "key" 名称

Need to "build" a "key" name in Mongoskin request

我正在开发 Node.js 应用程序,使用 Mongoskin 和 Express.js。 首先,这是我正在使用的 MongoDB 集合的简单概述:

db.profiles.find()
{ "_id" : ObjectId("5559e6ad8da0dc030010cf64"), 
  "userid" : "63e9c530-fd60-11e4-a30c-f3b609480e30", 
  "emailaddr" : { "value" : "x@y.fr", "share" : false },
  "fullname" : { "value" : "Azerty Ytreza", "share" : true },
  "telnumber" : { "value" : "0606060606", "share" : true }

如您所见,我正在存储多个对象,遵循相同的架构(值 + 布尔值) 根据用户想要分享/不再分享的内容,我需要更新 好的对象 .

的 "share" 值

首先,我不知道如何修改对象中存储的值。 参考这个:Modify nested Object value,我想我可以在我的 Mongoskin 请求中这样做:

db.collection.update(  { _id:...} , { $set: { some_key.param2 : new_info  } } 

在这种情况下,Node.js 报错,说 "SyntaxError: Unexpected token '.' "。

问题是,正如我之前所说,根据用户想要修改的内容,我不会修改相同的内容 "key"。 所以,我需要建立键名。示例:如果用户想要修改他的电子邮件地址的 "share" 值,我将需要更新 emailaddr.share。但是我怎样才能使用 Mongoskin 做到这一点呢? 我尝试了不同的解决方案,但不可能做这样的事情:

var key = "emailaddr",
    newVal = "true";

key += ".share";

db.collection.update( { _id: ... } { $set: { key : newval } }

假设您要更改 fullname 属性 的 share 状态:

> var property = "fullname"
> var value = false

您必须动态构建 对象 {"fullname.share": false}¹ :

> var updt = {}
> updt[property + ".share"] = value

然后使用该对象作为参数 $set:

> db.test.update({"_id" : ObjectId("5559e6ad8da0dc030010cf64")},
...              {$set: updt})
//                      ^^^^
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })


1 作为旁注,如 in the doc 所解释的,引号("')是强制性的对象 属性 如果它包含 . - 因此 语法错误 您在问题中提到。