【问题标题】:node.js - nested array in mongoose findOneandUpdate with arrayFilternode.js - mongoose findOneandUpdate 中的嵌套数组,带有 arrayFilter
【发布时间】:2020-11-09 20:03:59
【问题描述】:

我知道这是一个重复的问题。但是我在更新嵌套数组时遇到了很多其他似乎遇到的相同障碍。我可以手动编写索引值,但显然这在实际的 api 部署中没有用。那么arrayFilters可以用在长度为1的数组上吗?我应该重组潜在客户模型,并将其还原为子文档吗?任何帮助都会很棒。

控制台错误

MongoError:在路径“resoStatus.representation.$[elem].document”中找不到标识符“elem”的数组过滤器

mongo中的文档

:
Object_id:5f15a5fe911928412c858fb0
name:"State POA"
postedDate:2020-07-19T05:56:19.738+00:00
assigned:5efd0c3d75bb7122943e3a49

req.params.id: 5f15a5fe911928412c858fb0

不起作用的功能

router.put(
  "/:id/resoStatus/representation/:id",
  upload,
  auth,
  async (req, res) => {
    console.log(req.params.id);
    const prospect = await Prospect.findOneAndUpdate(
      { "_id": req.body.prospectId },
      {
        "$set": {
          "resoStatus.representation.$[elem].document": req.file.filename,
          "resoStatus.representation.$[elem].updatedDate": req.file.uploadDate,
          "resoStatus.representation.$[elem].id": req.body.id,
        },
        upsert: true,
        arrayFilters: [{ "elem._id": ObjectID(req.params.id) }],
      },
      (err) => {
        if (err) res.status(400).json(err);
      }
    );

    console.log(prospect.resoStatus.representation);
    res.status(200).json(prospect);
  }
);

有效的功能

router.put(
  "/:id/resoStatus/representation/:id",
  upload,
  auth,
  async (req, res) => {
    console.log(req.params.id);
    const prospect = await Prospect.findOneAndUpdate(
      { "_id": req.body.prospectId },
      {
        "$set": {
          "resoStatus.representation.0.document": req.file.filename,
          "resoStatus.representation.0.updatedDate": req.file.uploadDate,
          "resoStatus.representation.0.id": req.body.id,
        },
        upsert: true,
        arrayFilters: [{ "elem._id": ObjectID(req.params.id) }],
      },
      (err) => {
        if (err) res.status(400).json(err);
      }
    );

    console.log(prospect.resoStatus.representation);
    res.status(200).json(prospect);
  }
);

猫鼬模型

 representation: [
      {
        document: String,
        name: String,
        postedDate: Date,
        id: String,
        updatedDate: Date,
        endpoint: String,
        assigned: { type: mongoose.Schema.Types.ObjectId, ref: "user" },
      }]

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    您可以使用$-operator 来更新与查询文档匹配的第一个元素:

    "$set": {
              "resoStatus.representation.$.document": req.file.filename,
              "resoStatus.representation.$.updatedDate": req.file.uploadDate,
              "resoStatus.representation.$.id": req.body.id,
            }
    

    如果需要更新匹配文档的所有数组元素,可以使用all-positional operator

    "$set": {
              "resoStatus.representation.$[].document": req.file.filename,
              "resoStatus.representation.$[].updatedDate": req.file.uploadDate,
              "resoStatus.representation.$[].id": req.body.id,
            }
    

    【讨论】:

    • 所以这将匹配所有或第一个与对象ID?
    • 我猜 elem 是硬编码在别人的架构中并被继承的东西。我假设您只需要按原样映射对象。但是只用一个空白 [] 删除 elem 就可以了!人是从这里开始下山的。 :D
    • 不,两个查询匹配完全相同的文档,即匹配过滤器{ "_id": req.body.prospectId }的文档。选项 1 然后更新数组中满足条件(文件名、日期、id)的第一个元素。第二个更新所有数组元素。
    • 乐于助人,请采纳答案。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2018-08-18
    • 2016-10-12
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多