当前位置: 首页 > 知识库问答 >
问题:

mongodb查询更新选择嵌套字段

连乐
2023-03-14

这是我在mongo的文档:

"calendar": {
        "_id": "5cd26a886458720f7a66a3b8",
        "hotel": "5cd02fe495be1a4f48150447",
        "calendar": [
            {
                "_id": "5cd26a886458720f7a66a413",
                "date": "1970-01-01T00:00:00.001Z",
                "rooms": [
                    {
                        "_id": "5cd26a886458720f7a66a415",
                        "room": "5cd17d82ca56fe43e24ae5d3",
                        "price": "",
                        "remaining": 0,
                        "reserved": 0
                    },
                    {
                        "_id": "5cd26a886458720f7a66a414",
                        "room": "5cd17db6ca56fe43e24ae5d4",
                        "price": "",
                        "remaining": 0,
                        "reserved": 0
                    }
                ]
            },
   }

我需要更新内部房间阵列中的对象。我尝试了一个选择匹配元素的查询没有语法错误,但出现了一个错误:

“errmsg”:“字段“calendar.0.rooms.0.price”必须是数组,但在文档{u id:ObjectId('5cd26a886458720f7a66a3b8')中为字符串类型”,

这是我的疑问:

db.calendars.updateOne({_id:ObjectId("5cd26a886458720f7a66a3b8"), 
 "calendar":{"$elemMatch":{"_id":ObjectId("5cd26a886458720f7a66a413"),"rooms._id":
 ObjectId("5cd26a886458720f7a66a415")}}}, 
{"$push":{"calendar.$[outer].rooms.$[inner].price":"100000"}}, {"arrayFilters":[{"outer._id":ObjectId("5cd26a886458720f7a66a413")},{"inner._id":ObjectId("5cd26a886458720f7a66a415")}]})

这是我在StackOverflow中找到的一些参考,但没有帮助:用MongoDB更新嵌套数组

共有1个答案

乐修远
2023-03-14

您可以使用下面的查询

db.getCollection("test").updateOne(
  {
    "_id": ObjectId("5cd26a886458720f7a66a3b8"),
    "calendar.calendar": {
      "$elemMatch": {
        "_id": ObjectId("5cd26a886458720f7a66a413"),
        "rooms._id": ObjectId("5cd26a886458720f7a66a415")
      }
    }
  },
  { "$set": { "calendar.calendar.$[outer].rooms.$[inner].price": "100000" } },
  {
    "arrayFilters": [
      { "outer._id": ObjectId("5cd26a886458720f7a66a413") },
      { "inner._id": ObjectId("5cd26a886458720f7a66a415") }
    ]
  }
)

稍后我会更新我的答案并解释

 类似资料:
  • 本文向大家介绍MongoDB查询中如何更新嵌套文档,包括了MongoDB查询中如何更新嵌套文档的使用技巧和注意事项,需要的朋友参考一下 要更新嵌套文档,请使用update(),并在其中使用点号。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是更新嵌套文档的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 问题内容: 我有两个表,它们的定义是: 我想知道未在中引用的行数,可以通过以下方式完成: 有没有更有效的方法来执行此查询? 问题答案: 升级到MySQL 5.6,可以更好地针对子查询优化半联接。 见http://dev.mysql.com/doc/refman/5.6/en/subquery- optimization.html 否则使用排除联接: 另外,请确保上面有一个索引。

  • 我问了这个问题作为对另一个问题的评论,也在mongodb-user上发布了一个问题。到目前为止没有回复,所以我求助于问一个单独的问题。 文件说明: 如果字段包含一个数组,则$in操作符选择其字段包含数组的文档,该数组至少包含一个与指定数组中的值匹配的元素(例如,等等) 我正在使用: 在MongoDB外壳中: 下面是应根据文档及其生成的结果工作的查询列表: 为什么这个不行? 为什么我需要所有的钱?

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 问题内容: 我发现了具有正确答案的类似问题。但是它们对我来说有点复杂。我只想要一个简单的基本声明。 我有: …和: 如何合并它们? 问题答案: 有关OUTPUT子句的更多信息,请查看此文章。

  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!