如何格式化此猫鼬 updateone 查询

Posted

技术标签:

【中文标题】如何格式化此猫鼬 updateone 查询【英文标题】:How can I format this mongoose updateone query 【发布时间】: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 的记录吗? 更新了输出 【参考方案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 的示例 查询现在正在工作并返回成功,但是由于某种原因,数据库中的值没有改变。由于拼写错误,我更新了代码和数据库模式,并提供了新的输出。感谢您的帮助 所以请求返回了正确更新的文档但数据库没有保存更改?

以上是关于如何格式化此猫鼬 updateone 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期格式从对象的猫鼬数组更改为 ejs 视图上的字符串?

为啥猫鼬会删除我的部分查询

如何以 HTML5 输入类型日期格式(dd/mm/yyyy)显示猫鼬日期,

猫鼬改变模式格式

没有重复的猫鼬帖子

如何使用猫鼬更新数组中的现有对象