您好我是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'
?? ,是不正确的
我在互联网上搜索了很多,答案和文章让我感到困惑。
所以任何人都可以解释一下正确的方法以及点符号和$运算符之间的区别。
提前谢谢你。
答案 0 :(得分:1)
$运算符的行为取决于它所使用的上下文。通常,它用于代替数组索引。
在这里,您在update
查询中使用它。这意味着您将更新与搜索条件匹配的第一个元素。在此,您的条件为{'_id': ObjectId("11111111111111"), 'stops._id': ObjectId("222222222222222")}
。在没有$运算符的情况下使用stops._id
是可以的,因为MongoDB将搜索具有指定ObjectID的每个停靠元素(即,它从不需要特定的索引)。指定$set
时,$运算符告诉MongoDB更新从搜索返回的数组中的第一个文档。由于您要查询一系列文档,因此返回 ALSO 是一个文档数组,即使它的长度为1!简而言之,在update
个查询中,$运算符用于代替特定索引。应该注意的是,如果您正在尝试使用upsert
,或者如果您使用$ne
之类的否定运算符搜索数组,则无法使用它。
在find
查询中,$运算符的使用方式几乎相同。它将导致查询仅返回数组的第一个元素(类似于关系数据库中的投影)。值得注意的是,当以这种方式使用时,$运算符更受限制。在查询中只能使用一个$运算符,查询中只能出现一个数组,并且只能评估一个条件。
应该注意,在任何情况下都不能使用$运算符来遍历多个数组或嵌套数组。总而言之,$运算符是一种更具表现力的方式,可以在不指定索引的情况下访问数组的第一个元素和第一个元素。您不能使用点表示法代替它,因为您需要索引。当你知道你总是得到长度为1或零的数组时,最好使用它。
官方文档:update query,find query。