美文网首页
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