mongodb update 无法准确更新数据

发布于 2022-09-04 15:31:36 字数 4318 浏览 20 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嘦怹 2022-09-11 15:31:36

问题不在$and上,在$elemMatch上。你要查的目的是有一个数组元素同时具备id=2 && size=111,这时候应该使用$elemMatch。请阅读上面的链接文档了解更多详细信息。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文