【问题标题】:MongoDB - Can't push an item to an array inside an object inside an arrayMongoDB - 无法将项目推送到数组内对象内的数组
【发布时间】:2019-07-20 11:25:57
【问题描述】:

我在 MongoDB 中有这个对象:

{
  _id: ObjectId("1"),
  data: {
    city: "ccp",
    universities: [
      {
        _id: "2"
        name: "universityOne"
        students: []
      },
      {
        _id: "3"
        name: "universityTwo",
        students: []
      }
    ]
  }
}

我需要将一个Student 对象推入students 数组内的universityOne 对象内universities 数组内的全局对象内。

我尝试了文档并提出了这个查询。 Mongo shell 返回{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }。没有任何改变。

以下是格式化/未格式化的查询,您可以查看它们:

db.pautas.updateOne({_id: ObjectId("1")}, {$push: {"data.universities.$[id].students": {name: "aStudentName", age: 22}}}, {arrayFilters: [{"id._id": ObjectId("2")}]})

db.pautas.updateOne({_id: ObjectId("1")}, {$push: {"data.universities.$[id].students": {name: "aStudentName", age: 22}} }, {arrayFilters: [{"id._id": ObjectId("2")}]})

第二个查询是 mongo [<identifier>] 上的大学名称。但也不起作用。

db.pautas.updateOne({_id: ObjectId("1")}, {$push: {"data.universities.$[name].students": {name: "aStudentName", age: 22}}}, {arrayFilters: [{"name.name": "universityOne"}]})

db.pautas.updateOne({_id: ObjectId("1")}, {$push: {"data.universities.$[name].students": {name: "aStudentName", age: 22}} }, {arrayFilters: [{"name.name": "universityOne"}]})

问候。


更新

实物:

{
  _id: ObjectId("5c6aef9bfc1a2693588827d9"),
  datosAcademicos: {
    internados: [
      { 
        _id: ObjectId("5c6bfae98857df9f668ff2eb"),
        pautas: []
      },
      {
        _id: ObjectId("5c6c140f8857df9f668ff2ec"),
        pautas: []
      }
    ]
  }
}

我需要将 Pauta 添加到 pautas 数组。我已将pautas 设置为字符串数组以进行调试,因此只需推送“hello world”或任何字符串。

我用我得到的答案尝试了这个:

db.pautas.updateOne({"_id":ObjectId("5c6aef9bfc1a2693588827d9"), "datosAcademicos.internados._id": ObjectId("5c6bfae98857df9f668ff2eb")}, { $push: {"datosAcademicos.internados.$.pautas": "hi"}})

db.pautas.updateOne({"_id":ObjectId("5c6aef9bfc1a2693588827d9"), "datosAcademicos.internados._id": ObjectId("5c6bfae98857df9f668ff2eb")}, { $push: {"datosAcademicos.internados.$.pautas ": "你好"}})


更新 2:

Mongo 版本:v4.0.2 使用 Robo 3T。

我创建了一个测试数据库

并尝试了这个命令

还是不行。

【问题讨论】:

  • _id 还是id 在您文档的根级别?如果您将过滤条件从 id 更改为 _id 它可以工作
  • 它是_id,我编辑了它。感谢您的回答。但是还是不行。
  • 可能是集合名称示例 vs pautas ?
  • 耶稣,你是对的。

标签: arrays mongodb mongoose


【解决方案1】:

您的陈述存在 3 个问题。首先,根 ID 字段是“id”,您查询的是“_ID”。

其次,您应该完全放置匹配字段。此更新按预期工作。

第三,你应该使用“$”来选择嵌套数组的位置,而不是“$[id]”。

db.pautas.updateOne(
{ "id": ObjectId("1"), "data.universities._id": "2"}, 
{$push: 
    {"data.universities.$.students": {name: "aStudentName", age: 22}}
})

更新问题的答案: 更新语句工作得很好。

更新声明

更新后记录 - 我用你的数据和你发布的更新代码运行了我的更新,两者都运行良好。

【讨论】:

  • 运行时遇到什么错误?在我的测试中,我删除了 ObjectId("1") 并且只使用了“1”。这导致了一些错误。
  • 没有错误,同样的{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }。我的对象不完全相同,但结构相同,我不知道出了什么问题。我尝试删除每个 ObjectId 或仅删除第一个或最后一个,但同样的事情发生了。
  • 所以问题出在匹配句上。如果您发布您的真实对象以及您想要匹配的内容,我可以给您一个提示。
  • 我用一些截图更新了答案。更新语句在这里工作得很好。我正在使用 Robot3T 来操作数据库。您要从哪里更新这些记录?代码?另一个界面?你用的是什么Mongo版本?
  • 我刚刚意识到我的查询有另一个集合的名称,而不是我试图更新的那个。非常感谢您的回答,最重要的是,感谢您的时间。这是正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2015-09-11
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多