如何用猫鼬更新

时间:2019-12-21 20:06:25

标签: mongodb mongoose mongoose-schema

我有这个记录

{
    "_id" : ObjectId("5dfdff479ad032cbbc673507"),
    "selection" : [ 
        {
            "highlights" : "test",
            "comment" : "CHANGE THIS",
            "el" : "body:nth-child(2)>div:nth-child(2)#root>div.App>p:nth-child(1)"
        }, 
        {
            "highlights" : "Barrett’s lyrical prose opens with a clever and tender solution",
            "comment" : "",
            "el" : "body:nth-child(2)>div:nth-child(2)#root>div.App>p:nth-child(2)"
        }
    ],
    "category" : [],
    "status" : "",
    "url" : "http://localhost:3000/theone",
    "title" : "React App test",
    "__v" : 4
}

我想更新comment。我尝试使用updatefindOneAndUpdate,但没有任何效果。这是我的尝试

WebHighlight.findOneAndUpdate(
  {
    _id: req.params.highlight,
    "selection.highlights": "test"
  },
  { "selection.$.comment": "yourValue" }
);

req.params.highlight是ID(我甚至对其进行了硬编码)

我也尝试过

WebHighlight.findById(req.params.highlight, (err, book) => {
  var test = [...book.selection];
  test[0].comment = "somethibf"
  book.save();
  res.json(book);
});

没有任何作用。

这是模型

const webhighlightsModel = new Schema({
  selection: { type: Array, default: "" },
  category: { type: Array, default: [] },
  title: { type: String },
  url: { type: String },
  status: { type: String, default: "" }
});

2 个答案:

答案 0 :(得分:1)

实际上,您的代码似乎可以正常工作,但是如果您不提供{new: true}选项,则findOneAndUpdate返回旧文档

出于这种原因,我认为您认为更新不成功,但是如果您检查了自己的收藏,就会看到更新。

WebHighlight.findOneAndUpdate(
  {
    _id: req.params.highlight,
    "selection.highlights": "test"
  },
  { "selection.$.comment": "yourValue" },
  { new: true }
)
  .then(doc => res.send(doc))
  .catch(err => res.status(500).send(err));

另外,我认为选择具有以下子模式会更好:

const mongoose = require("mongoose");

const schema = new mongoose.Schema({
  selection: [
    new mongoose.Schema({
      highlights: String,
      comment: String,
      el: String
    })
  ],
  category: { type: Array, default: [] },
  title: { type: String },
  url: { type: String },
  status: { type: String, default: "" }
});

module.exports = mongoose.model("WebHighlight", schema);

因此,每次选择都会有一个_id字段,最好使用此_id进行更新。

答案 1 :(得分:0)

您应该使用$set运算符来更新现有值:

WebHighlight.findOneAndUpdate(
  {
    _id: req.params.highlight,
    "selection.highlights": "test"
  },
  { '$set': { "selection.$.comment": "yourValue" } }
);