在segmentfault寻求答案解决后,在此📝一下,
✅深刻的教训之----没事多看看文档📚
需求: 根据
两个字段
锁定🔐
一个对象, 并进行更新
第一步: 插入测试数据
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运算符,亦然❌,
不知所以然
已解决
感谢@Mongoing中文社区[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
}
]
}
X. 遗留问题
X.1. update第一个参数默认的是||
运算吗?
--Mongo官方文档---$and--
更多精彩内容请关注“IT实战联盟”哦~~~
IT实战联盟.jpg
网友评论