【问题标题】:How can I format this mongoose updateone query如何格式化此猫鼬 updateone 查询
【发布时间】:2022-01-17 05:51:33
【问题描述】:

更新:我使用这里有人推荐的 arrayFilters 调整了查询​​,查询成功返回,但是数据库中的值永远不会改变。

我正在尝试根据传递给数据库函数的值更新 mongodb 集合中的某些字段。

module.exports.update_sprint = async function 
       update_sprint(teamname, update_data, sprint, sprintStar) {

    for(var i in update_data) {
      console.log(update_data[i].stars)
      console.log(update_data[i].name)
      TeamM.findOneAndUpdate({teamName: teamname}, {
        $set: {
          'sprints.$[a].stars.$[b].stars': update_data[i].stars,
          'sprints.$[a].stars.$[b].points': update_data[i].points,
          'sprints.$[a].sprintstars': sprintStar
        }
      }, {arrayFilters: [{"a.sprintnum": sprint}, {"b.name": 
update_data[i].name}]}
      ,
      function(error, success) {
        if (error) {
          console.log(error)
        } else {
          console.log(success)
        }}
      )

}

}

数据库格式: enter image description here

我得到:

1
member1@lewisu.edu
0
member2@lewisu.edu
{
  _id: new ObjectId("61b90840654b60a745e7e102"),
  teamName: 'testing',
  members: [ 'member1@lewisu.edu', 'member2@lewisu.edu' ],
  scrumMaster: 'member1@lewisu.edu',
  totalMembers: 2,
  sprints: [ { sprintnum: 1, stars: [Array], sprintstar: 'None' } ],
  __v: 0
}
{
  _id: new ObjectId("61b90840654b60a745e7e102"),
  teamName: 'testing',
  members: [ 'member1@lewisu.edu', 'member2@lewisu.edu' ],
  scrumMaster: 'member1@lewisu.edu',
  totalMembers: 2,
  sprints: [ { sprintnum: 1, stars: [Array], sprintstar: 'None' } ],
  __v: 0
}

查询成功返回,但数据库中的值未更新

【问题讨论】:

  • 结果告诉你modifiedCount = 0,表示没有匹配的条目需要修改
  • 我看到了,但是条目在那里,我只是认为我没有正确设置搜索参数。
  • 你能从请求中提供你的团队名称和 sprintum 的记录吗?
  • 更新了输出

标签: javascript node.js mongodb express mongoose


【解决方案1】:

在您的请求中,您想匹配 sprints = sprintum,您只需将其更改为:

Test.updateOne({ teamName: "test123", "sprints.sprintnum": 1 }, { // Mistake was  in this line
            $set: {
                'sprints.$.stars': update_data,
                'sprints.$.sprintstar': sprintStar
            }
        })

之前:

{
  "teamName": "test123",
  "members": [
    "test@lewisu.edu",
    "test@lewisu.edu"
  ],
  "scrumMaster": "test@lewisu.edu",
  "totalMembers": 2,
  "sprints": [
    {
      "sprintum": 1,
      "stars": [
        {
          "name": "test@lewisu.edu",
          "stars": 0,
          "points": 0
        },
        {
          "name": "test2@lewisu.edu",
          "stars": 0,
          "points": 0
        }
      ],
      "sprintstar": "None"
    }
  ]
}

之后:

根据您的评论,我添加了多个标识符的示例:

Test.updateOne({ teamName: "test123" }, {
            $set: {
                'sprints.$[i].stars.$[j].stars': 5,
                'sprints.$[i].sprintstar': "test@lewisu.edu"
            }
        }, { arrayFilters: [{ "i.sprintum": 1 }, { "j.name": "test@lewisu.edu" }] })

这将在带有 sprintum 的数组中更新 stars 数组中名称为“test@lewisu.edu”的人的星星

有了这个,你基本上可以在文档中的所有数组中做任何你想做的事情

【讨论】:

  • 我不确定 sprintnum 是如何拼写错误的,但是在修复之后,我仍然没有更新值。它仍在查找条目,但是我认为将其丢弃的是子条目的数字排序并且无法引用它,例如,星号:数组的条目以数字顺序 0、1 列出。此应用程序越多将被使用,星号下的条目就会越多。但话又说回来,我对猫鼬很陌生。
  • 如果要控制多个嵌套数组,可以使用 arrayFilters,它们是 updateOne() 函数中的第三个参数。这里有一个链接:docs.mongodb.com/manual/reference/operator/update/… 您可以通过首先识别具有 sprintum = 1 的对象然后识别具有名称 = test@lewisu.edu 的对象并在那里调整点来访问您想要的对象
  • 我编辑了答案,在底部为您添加了 arrayFilters 的示例
  • 查询现在正在工作并返回成功,但是由于某种原因,数据库中的值没有改变。由于拼写错误,我更新了代码和数据库模式,并提供了新的输出。感谢您的帮助
  • 所以请求返回了正确更新的文档但数据库没有保存更改?
猜你喜欢
  • 2018-02-05
  • 2019-10-18
  • 1970-01-01
  • 2020-06-11
  • 2020-06-02
  • 2012-02-03
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
相关资源
最近更新 更多