【问题标题】:Programmatically modify existing mongo document以编程方式修改现有的 mongo 文档
【发布时间】:2013-07-10 10:04:28
【问题描述】:

已解决,问题出在 PUT 请求上,我必须正确指定标头并一次处理一个。

curl -X PUT -H "Accept: application/json" -d "prenom=Maxwell" localhost:3000/contact/51df5cec5e88a2bbce7fac05

我正在尝试通过我目前正在使用的 node.js 应用程序中的咖啡脚本修改 mongodb 文档,当我尝试时:

 curl -X PUT -d '{"nom": "House", "prenom": "Maxwell"}' localhost:3000/contact/51ddb907ae3267d6154a3e64

关于这个

{
  "_id": "51ddb907ae3267d6154a3e64",
  "archive": 1,
  "nom": "Bir",
  "prenom": "Sim"
}

ID 和路线是正确的,所以我很确定错误在于 javascript 逻辑,但我似乎无法掌握正确的工作角度。这是有缺陷的代码:

   exports.modifyContact = (req, res) ->
     db.collection "data-center", (erreur, collection) ->
       collection.update { _id: new mongo.BSONPure.ObjectID(req.params.id) }, { $set: req.body } , (erreur, resultat) ->
         res.send resultat
         res.end()

结果是

{ 
  "_id" : ObjectId("51df4ad424f6d9207cc3e2d5"),
  "nom" : "Bir",
  "nom": "House",
  "prenom": "Maxwell" : "",
  "prenom" : "Sim" 
}

我似乎无法找到一种有效的方法来设置缺失值并修改其中已有的值。怎么了 ?

【问题讨论】:

    标签: node.js mongodb coffeescript


    【解决方案1】:

    试试这个:

    exports.modify = (req, res) ->
      fields = if (typeof req.body == 'string') then JSON.parse(req.body) else req.body
      db.collection "data-center", (erreur, collection) ->
        // check erreur here
        collection.update { _id: new mongo.BSONPure.ObjectID(req.params.id) }, { $set: fields }, (erreur, resultat) ->
          // check erreur here
          res.send resultat
          res.end()
    

    请务必注意,直接从 req.body 插入数据而不进行某种验证/内容检查是安全的,应该避免(即使它按预期工作)。

    【讨论】:

    • 我同意你的观点,我简化了我的代码,这样它就可以显示出我有问题的基本部分。我尝试了你的建议,它似乎可以工作,但我得到这个将循环结构转换为 JSON 错误,..
    • 对不起,我已经更新了答案。 collection.find 应该是 collection.update
    • 它不会替换字段,它只是给对象添加一个对象,你知道我怎样才能只获取字段值来替换对象字段值吗?
    • req.body 的内容是什么?另外,您在测试解决方案时是否使用了上面的确切代码或以某种方式对其进行了修改?
    • req.body 的内容是 "{'nom' : 'aName', 'prenom': 'aFirstName'}" 我 curl -X PUT -d "{'nom' : 'aName' , 'prenom': 'aFirstName'}" localhost:3000/url 与上面的代码完全相同
    【解决方案2】:

    如果您只想将一组字段“合并”到现有对象中,您可以这样做

    test:PRIMARY> db.t2.insert({b:1})
    test:PRIMARY> db.t2.update({b:1}, {$set: {a:1, c:2}})
    test:PRIMARY> db.t2.find({b:1})
    { "_id" : ObjectId("520a3f10e2d66ef50d3b042b"), "a" : 1, "b" : 1, "c" : 2 }
    

    啊,是的,对于 json 问题,您不能使用“原始”对象作为 json 返回。您需要执行 findOne 以从 mongodb 检索更新的对象,或更改为使用带有参数 new 的 findAndModify 以在单个操作中获取更改的对象。现有对象很可能有循环引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2015-02-27
      • 2017-08-01
      • 1970-01-01
      相关资源
      最近更新 更多