更正嵌套元素MongoDB的正确查询

时间:2016-03-13 06:04:29

标签: node.js mongodb nosql

您好我是mongoDB的新手,我有这样的订单集合。

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

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

我在te interent中搜索并提出了类似的查询

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

我的问题是

查询中的

使用'stops._id',但是当我们更新字段时,它会使用'stops.$.status'

如果我使用'stops.status' ??

是不正确的

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

所以任何人都可以解释一下正确的方法以及点符号和$运算符之间的区别。

提前谢谢你。

1 个答案:

答案 0 :(得分:1)

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

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

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

应该注意,在任何情况下都不能使用$运算符来遍历多个数组或嵌套数组。总而言之,$运算符是一种更具表现力的方式,可以在不指定索引的情况下访问数组的第一个元素和第一个元素。您不能使用点表示法代替它,因为您需要索引。当你知道你总是得到长度为1或零的数组时,最好使用它。

官方文档:update queryfind query