MongoDB Update方法(第 9 天)

作者 : 慕源网 本文共4653个字,预计阅读时间需要12分钟 发布时间: 2021-11-1 共343人阅读

在阅读本文之前,我强烈建议您阅读本系列的前几期:

update 方法修改集合中的文档。使用更新方法,我们可以修改整个文档或文档的特定字段。更新方法类似于关系数据库中的更新命令。它通常一次更新一个文档,但我们可以使用“Multi”参数更新多个文档。最后,update() 方法返回一个包含操作状态的对象。

语法: db.collection_Name.updat( { query , update , { upsert: <Boolean>, multi: <Boolean> } } )

参数

Parameter Type 描述
Query Document Query 是更新命令的选择标准。
Update Document 更新标准
Upsert Boolean 可选的。默认设置为 False。如果设置为 true,则在没有文档与查询条件匹配时创建新文档,否则不会插入新文档。
Multi Boolean 可选的。默认设置为 False。如果设置为 true,则更新满足查询条件的多个文档,否则更新单个文档。

Method方法的方式

当我们使用update 命令时,有两种可能性:

  1. Update 方法修改特定字段。
  2. Update 方法完全替换现有文档。

情况 1:更新特定字段

如果 <Update> 参数仅包含更新操作符,例如:$set、$inc、$mul,则 update()方法仅更新文档中的相应字段。如果我们想将嵌入的文档或数组作为一个整体进行修改,请指定该字段的替换值。要更新嵌入文档或数组的特定字段,请对特定字段使用点 (.) 表示法。

情况 2:替换整个文档

要替换整个文档,<Update> 参数只包含一个 field:value 表达式。换句话说,<Update> 参数不应包含任何更新操作符。我们不能替换 _id 字段,更新方法不能替换多个文档。

当我们执行更新方法时,MongoDB 以确认的形式返回以下三个值。

Name Type 描述
nMatched Integer 返回与查询匹配的文档数
nMatched Integer 返回更新的文档数
nMatched Integer 返回更新文档的数量

首先,我们创建一个集合并将一些数据插入到这个集合中。

创建集合命令:

db.createCollection(“Demo”,{autoIndexID:true,size:5040321,max:100})

插入数据

{  
    "_id": ObjectId("55c89859626ebe75ff8e8814"),  
    "Title": "MongoDB-Day1",  
    "Likes": 3,  
    "Author": {  
        "PostBy": "Pankaj",  
        "Views": 2500  
    },  
    "Tags": ["MogoDB", "SQL", "Database"],  
    "Rating": [{  
        "By": "Rahul",  
        "Rate": 4  
    }]  
}  
  
{  
    "_id": ObjectId("55c898a2626ebe75ff8e8815"),  
    "Title": "MongoDB-Day2",  
    "Likes": 5,  
    "Author": {  
        "PostBy": "Pankaj",  
        "Views": 3500  
    },  
    "Tags": ["MogoDB", "SQL", "Database", "Introducti  
 on"],  
    "Rating": [{  
        "By": "Sandeep",  
        "Rate": 4  
    }, {  
        "By": "Rahul",  
        "Rate": 5  
    }]  
}  
  
{  
    "_id": ObjectId("55c898d1626ebe75ff8e8816"),  
    "Title": "MongoDB-Day3",  
    "Likes": 4,  
    "Author": {  
        "PostBy": "Pankaj",  
        "Views": 4500  
    },  
    "Tags": ["MogoDB", "Database", "Introduction"],  
    "Rating": [{  
        "By": "Sanjeev",  
        "Rate": 3  
    }, {  
        "By": "Div",  
        "Rate": 5  
    }]  
}  
  
{  
    "_id": ObjectId("55c898f1626ebe75ff8e8817"),  
    "Title": "MongoDB-Day4",  
    "Likes": 9,  
    "Author": {  
        "PostBy": "Pankaj",  
        "Views": 6500  
    },  
    "Tags": ["MogoDB", "Database"],  
    "Rating": [{  
        "  
 By": "Sanjeev",  
        "Rate": 5  
    }]  
}  

插入上述数据后,Demo 集合如下所示:

现在我们将执行一些查询并了解 Update() 方法的行为。

更新特定字段

要更新文档的特定字段,请使用 <update> 参数中的更新运算符。

查询: db.Demo.update({Title:”MongoDB-Day1″},{$set:{Likes:10}})

此查询更新文档的Likes字段的值 。这是包含“MogoDB-Day1”值的标题字段。此查询更新与查询字段匹配的第一个文档的值。

更新后的文档

Likes字段的值 已更改,如下所示

在前面的例子中,我们使用了“$set”更新操作符。“$set”运算符替换字段的值。

让我们看看另一个更新操作符。

查询: db.Demo.update({Title:”MongoDB-Day1″},{$inc:{Likes:5}})

在此查询中,“$inc”更新运算符将Likes字段的值增加 5。在下图中,我们可以看到Likes字段的值 已更改。

更新后的文件

Likes 字段的值增加5

更新嵌入文档

要更新嵌入文档,我们可以使用点 (.) 记号。

询问

db.Demo.update({Title:”MongoDB-Day1″},{$set:{“Author.PostBy”:”Pankaj Choudhary”,”Author.Views “:6000}})

此查询更新“ PostBy ”和“Views”嵌入文档的“Author”字段,其中文档的标题字段等于“MongoDB-Day1”。更新后的文档重要点当我们创建一个带有选项参数的集合时,这样的集合被称为有上限的集合。一个封顶集合禁止增加文档尺寸确保了文件磁盘上不改变其位置的更新。让我们看一个例子。首先,我们创建一个“ nam ”上限集合。

我们可以看到 ipped 参数的值为“true”。换句话说,“nam”是一个有上限的类型集合。现在我们将一些数据插入到“nam”集合中。

让我们尝试更新文档,看看会发生什么。

在前面的查询中,我们尝试更新文档的“Name”字段,但 MongoDB 抛出错误,因为我们试图增加文档的大小。这里是 Sizeof(“Pankaj Kumar Choudhary”) > Sizeof(“Pankaj Kumar”)。

让我们尝试另一个查询。

前面的查询已成功执行,因为此查询不会增加文档的大小。Sizeof(“Pankaj”) > Sizeof(“pankaj Kumar”)。

结论

Capped 集合具有 Capped 集合禁止增加文档大小的更新的属性。因此,如果我们将文档插入到 Capped 集合中,那么我们应该记住,将来我们无法增加文档的大小。因此,我们应该使用足够大小的文档以供进一步使用。

更新多个文档

要更新多个文档,请将 multi-option 设置为 true。

查询:db.Demo.update({“Author.PostBy”:”Pankaj”},{$set:{Likes:13}},{multi:true})

此查询将“Likes”字段的值设置为等于13 其中“Autore.Post”字段的值为“Pankaj”。

更新后的文件

上图显示Likes字段的值已更改。

替换所有字段

如果我们传递一个只包含字段和值对的 <update> 文档,换句话说,我们传递了一个没有更新操作符的 <update> 文档,那么除了 _id 字段之外,<update> 文档完全替换了原始文档.

查询

db.Demo.update({Title:”MongoDB-Day1″ },{Title:”Introduction to NoSQL”,Author:”Nitin Yadav”,
Tags:[“NoSQL”,”MongoDB”,”SQL”]} )

此查询将原始文档替换为给定文档,其中“Title”字段的值为“MongoDB-Day1”。

更新后的文件

使用 Upsert 方法

如果 Upsert 选项设置为 true,则它会创建一个新文档。当没有文档符合查询条件时,它不会插入新文档。

查询

db.Demo.update({Title:”MongoDB-Day5″ },{Title:”MongoBD-Day6″,Author:”Narendra Sharma”,Tags:[“NoSQL”,”MongoDB”,”SQL”]}, {upsert:true})

此查询首先匹配现有的选择条件。如果任何文档与选择标准匹配,那么它将被替换,否则插入一个新文档。

更新后的

文档 在集合中创建一个新文档。

Upsert 和 Multi Options

在 upsert 和 multi-option 的结合使用中,有两种可能性:

  1. 如果任何文档与查询模式不匹配,则将插入一个新文档。
  2. 如果任何文档与查询模式匹配,那么它将更新所有这些文档。

让我们看一下这两种情况的示例。

案例 1:文档匹配查询模式

查询

db.Demo.update({Title:”ASP.Net MVC5″},{$set:{“Likes” : 5, Author:{PostBy:”Sanjeev”,Views :3200
},Tags:[“ASP.Net”,”MVC”]}},{Multi:1,upsert:1})

更新后的

文档 已插入新文档。

案例2:当文档匹配查询模式时

Query

db.Demo.update({“Author.PostBy”:”Pankaj”},{$set:{“Likes” : 5, Author:{PostBy:”Sanjeev”,Views :
3200},Tags:[“ASP.Net”,”MVC”]}},{Multi:1,upsert:1})

更新后

现有文档已更新。

更新嵌入文档数组:要更新嵌入文档数组的文档,请使用该文档的索引号和点 (.) 符号。

查询

db.Demo.update({Title:”MongoDB-Day2″},{$set:{“Rating.1″:{By:”Nivin”,Rate:3}}})

此查询更新第二个嵌入文档“评级”数组。

更新前的文件更新后的文件

{  
     "_id" : ObjectId("55c898a2626ebe75ff8e8815"),  
     "Title" : "MongoDB-Day2",  
     "Likes" : 5,  
     "Author" : {  
             "PostBy" : "Sanjeev",  
             "Views" : 3200  
     },  
     "Tags" : [  
             "ASP.Net",  
             "MVC"  
     ],  
     "Rating" : [  
             {  
                     "By" : "Sandeep",  
                     "Rate" : 4  
             },  
             {  
                     "By" : "Nivin",  
                     "Rate" : 3  
             }  
     ]  
 }  

这篇文章描述了更新方法并以各种方式使用它。在下一篇文章中,我们将学习一种新的Collection 方法。

感谢您阅读这篇文章!


慕源网 » MongoDB Update方法(第 9 天)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录