mongodb update 无法准确更新数据
update 无法准确更新数据
已解决, 附属答案在最后
根据两个字段
锁定
一个对象, 并进行更新
第一步: 插入测试数据
db.hh.insert({
"title": "test",
"Products" : [
{
"id":1,
"name" : "mongodb",
"size" : 10,
},{
"id":1,
"name" : "mongodb",
"size" : 111,
},{
"id":2,
"name" : "Nodejs",
"size" : 111,
}
]
})
第二步: 采用update+$inc
在对象 id : 1, size : 111
上添加num
字段($inc
)
> db.hh.update({"title": "test", "Products.id": 1, "Products.size":111}, {"$inc": {"Products.$.num": 1}})
查询结果: (达到预期
)
> db.hh.find().pretty()
{
"_id" : ObjectId("58c7f576c8486a71b6b8ba3a"),
"title" : "test",
"Products" : [
{
"id" : 1,
"name" : "mongodb",
"size" : 10
},
{
"id" : 1,
"name" : "mongodb",
"size" : 111,
"num" : 1
},
{
"id" : 2,
"name" : "Nodejs",
"size" : 111
}
]
}
第三步. 继续更新(问题出现的地方)
在对象 id : 2, size : 111
上添加num
字段($inc
)
> db.hh.update({"title": "test", "Products.id": 2, "Products.size":111}, {"$inc": {"Products.$.num": 1}})
查询结果(更新对象❌), 更新在第一次筛选的对象上了,
> db.hh.find().pretty()
{
"_id" : ObjectId("58c7f576c8486a71b6b8ba3a"),
"title" : "test",
"Products" : [
{
"id" : 1,
"name" : "mongodb",
"size" : 10
},
{
"id" : 1,
"name" : "mongodb",
"size" : 111,
"num" : 2
},
{
"id" : 2,
"name" : "Nodejs",
"size" : 111
}
]
}
第四步: 求解
个人的思路, 问题可能出在 update第一个参数上, 多个选项时是||运算, 而不是&&运算,
但是添加$and运算符,亦然❌,
不知所以然
烦请指点, O(∩_∩)O谢谢
已解决
感谢@Mongoing中文社区 的指点.
第一步: 查阅 elemMatch官方文档,
摘录一段话:
The $elemMatch
operator matches documents that contain an array
field with at least one
element that matches all the specified query criteria.
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
If
you specify only a single
<query> condition in the $elemMatch expression, you do not need
to use $elemMatch.
正合需求
.
第二步: 继续查阅 update文档
对于update
第一个参数为对象
,那么这个对象怎么才能够既满足$elemMatch
又满足对象(而不是数组)
呢?
摘录文档中的一段代码;
db.students.update(
{
_id: 4,
grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
},
{ $set: { "grades.$.std" : 6 } }
)
以上的查阅就可以满足需求了
开工
db.hh.update(
{
"title" : "test",
"Products": {"$elemMatch":{"id" : 2, "size":111}}
},
{"$inc": {"Products.$.num": 10}}
)
检验
> db.hh.find().pretty()
{
"_id" : ObjectId("58c7f576c8486a71b6b8ba3a"),
"title" : "test",
"Products" : [
{
"id" : 1,
"name" : "mongodb",
"size" : 10
},
{
"id" : 1,
"name" : "mongodb",
"size" : 111,
"num" : 2
},
{
"id" : 2,
"name" : "Nodejs",
"size" : 111,
#在此满足最初的需求
"num" : 10
}
]
}
--Mongo官方文档---$and--
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题不在
$and
上,在$elemMatch上。你要查的目的是有一个数组元素同时具备id=2 && size=111
,这时候应该使用$elemMatch
。请阅读上面的链接文档了解更多详细信息。