美文网首页
Mongodb update更新之艰难历程(X.2)

Mongodb update更新之艰难历程(X.2)

作者: simuty | 来源:发表于2017-03-15 10:01 被阅读232次

在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

相关文章

网友评论

      本文标题:Mongodb update更新之艰难历程(X.2)

      本文链接:https://www.haomeiwen.com/subject/bixlnttx.html