【问题标题】:Correct query for update nested element MongoDB更新嵌套元素 MongoDB 的正确查询
【发布时间】:2017-07-01 17:48:30
【问题描述】:

嗨,我是 mongoDB 的新手,我有一个像这样的 order 集合。

{
    "_id" : ObjectId("11111111111111"),
    "stops" : [
        {
            "_id" : ObjectId("222222222222222"),
            "status" : "IN PROGRESS"
       },
       {
            "_id" : ObjectId("33333333333333"),
            "status" : "PENDING"
       }]
}

我想更新订单id = "11111111111111" 记录的停止状态和 停止id = "222222222222222" 完成。

我在网上搜索并想出了这样的查询

db.order.update(
    {'_id': ObjectId("11111111111111"), 'stops._id': ObjectId("222222222222222")},
     $set: {
            'stops.$.status': "DONE",
      }
);

我的问题是

在查询中它使用'stops._id',但是当我们更新它使用'stops.$.status'的字段时

如果我使用'stops.status' 是不是不正确??

我在互联网上搜索了很多,答案和文章让我感到困惑。

所以谁能解释一下什么是正确的方法以及点符号和 $ 运算符之间的区别。

提前谢谢你。

【问题讨论】:

    标签: node.js mongodb nosql


    【解决方案1】:

    $ 运算符的作用取决于它所使用的上下文。通常,它用于代替数组索引。

    在这里,您在 update 查询中使用它。这意味着您将更新与搜索条件匹配的第一个元素。在这里,您的标准是{'_id': ObjectId("11111111111111"), 'stops._id': ObjectId("222222222222222")}。可以在没有 $ 运算符的情况下使用stops._id,因为 MongoDB 将搜索具有指定 ObjectID 的每个停止元素(即,它从不需要特定索引)。当指定 $set 时,$ 运算符告诉 MongoDB 更新从搜索返回的数组中的 first 文档。由于您正在查询一个文档数组,因此返回将 ALSO 是一个文档数组,即使它的长度为 1!简而言之,在update 查询中,$ 运算符用于代替特定索引。应该注意的是,如果您尝试使用 upsert 或使用否定运算符(例如 $ne)搜索数组,则不能使用它。

    find 查询中,$ 运算符的使用方式几乎相同。它将导致查询仅返回数组的第一个元素(类似于关系数据库中的投影)。值得注意的是,$ 运算符在以这种方式使用时受到更多限制。查询中只能使用一个 $ 运算符,查询中只能出现一个数组,并且只能计算一个条件。

    需要注意的是,在这两种情况下,$ 运算符都不能用于遍历多个数组或嵌套数组。总而言之,$ 运算符是一种在不指定索引的情况下访问数组的第一个也是唯一一个元素的更具表现力的方式。您不能使用点符号代替它,因为您需要一个索引。当你知道你总是会得到长度为 1 或 0 的数组时,最好使用它。

    官方文档:update queryfind query

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 2018-12-25
      • 2020-03-16
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      相关资源
      最近更新 更多