node.js - mongodb update 无法准确更新数据

查看:141
本文介绍了node.js - 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--

解决方案

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

这篇关于node.js - mongodb update 无法准确更新数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆