猿教程 Logo

.Net连接MongoDb:修改

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

介绍

在上一篇文章中,我们研究了可以与搜索和过滤结合使用的几个功能。 limit函数将从结果集中返回第一个x个项目数。 skip函数跳过整数参数指定的项目数。 经常使用limit和skip来查询大量的结果集。 最后,我们查看了排序函数,它帮助我们按升序或降序对一个或多个键进行结果集排序。

在这篇文章中,我们将开始研究更新。

更新功能

MongoDb JavaScript语言提供了一个集合的更新方法,它似乎是开始的逻辑。 但是,我们会看到使用它的基本形式可能是麻烦和危险的。 更新功能的这种基本形式需要两个JSON文档:第一个是查找要更新的项的键,第二个参数是替换文档。 这里的关键术语是替换。 它将完全替换当前文档中的新文档,而不管文档中要更新什么。 因此,该功能应该被称为“替换”。

我实际上不想将这个功能应用于我们的演示集合,因为它的笨拙。 我们将创建一个小但一次性的集合。 启动mongo和mongod.exe。 在mongo shell中输入以下命令:

use model
db.people.insert({"name" : "john", "sport" : "football", "language" : "english"})
db.people.insert({"name" : "peter", "sport" : "basketball", "language" : "english"})
db.people.insert({"name" : "john", "sport" : "baseball", "language" : "english"})
db.people.insert({"name" : "mary", "sport" : "football", "language" : "german"})
db.people.insert({"name" : "susan", "sport" : "squash", "language" : "french"})
db.people.insert({"name" : "abdul", "sport" : "tennis", "language" : "arabic"})
db.people.insert({"name" : "kelly", "sport" : "tennis", "language" : "english"})

我们现在有一个有7个文件的人物集合。 我们来试试更新彼得。 他不喜欢篮球,他换了高尔夫球。 我们将尝试使用更新方法更新此文档:

db.people.update({"name" : "peter"}, {"sport" : "golf"})

第一个参数是搜索词。 我们可以应用与查找方法相同的搜索技术。 然后是替换文件。 如果您不知道如何使用更新方法,那么您可以假设“sport”属性将更新为“golf”。 但是,如果你运行...

db.people.find()

...在更新语句之后,您会发现与彼得的原始文档已被完全替换:

{ "_id" : ObjectId("57055d43b98ee40de403824e"), "sport" : "golf" }

嗯,不完全是因为_id字段和以前一样。 但是,其余的属性都没有了。

因此,如果要使用更新功能更新单个属性,则需要知道文档中的其他属性并将其包含在替换的JSON文档中。 您可能会看到为什么这不是一个非常方便的方法,特别是对于复杂的文档。

因此,其基本形式的更新在Mongo shell中不是很有用。 在我的经验中,它更适用于.NET驱动程序,我们选择对象,修改其属性并将其作为替换对象发送到数据库。 现有的属性不需要更换,它们可以从搜索操作中获得。 我们稍后会看到用C#完成的更新。

在我们继续之前,让我们摆脱这个“腐败”的记录:

db.people.remove({"sport" : "golf"})

更新特定字段

幸运的是,update方法接受类似于我们之前看到的操作,像$ gt和$ not一样。 $ set运算符将特定属性的值设置为提供的属性值。 此外,如果找到的文档没有这样的属性,那么它将被创建。 $ inc操作符将通过提供的值增加一个数字字段。 如果没有提供的名称,它也会创建该属性。

我们会给苏珊一个最喜欢的运动,racketball:

db.people.update({"name" : "susan"}, {$set : {"sport" : "racketball"}})

这是更新的苏珊文件:

{ "_id" : ObjectId("57055daeb98ee40de4038251"), "name" : "susan", "sport" : "racketball", "language" : "french" }

我们尝试为苏珊设置一个不存在的属性:

db.people.update({"name" : "susan"}, {$set : {"points" : 10}})

这里是:

{ "_id" : ObjectId("57055daeb98ee40de4038251"), "name" : "susan", "sport" : "racketball", "language" : "french", "points" : 10 }

我们可以用$ inc来增加吗? 当然如此,为苏珊添加2分:

相关实例:

db.people.update({"name" : "susan"}, {$inc : {"points" : 2}})
{ "_id" : ObjectId("57055daeb98ee40de4038251"), "name" : "susan", "sport" : "racketball", "language" : "french", "points" : 12 }

我们可以增加不存在的财产吗? 当然,它将为我们创建,增量设置为初始值:

db.people.update({"name" : "abdul"}, {$inc : {"points" : 8}})
{ "_id" : ObjectId("57055dcab98ee40de4038252"), "name" : "abdul", "sport" : "tennis", "language" : "arabic", "points" : 8 }

请注意,我们有2个人名叫“john”。 让我们看看更新是否更新:

db.people.update({"name" : "john"}, {$set : {"points" : 20}})

答案是否定的,它只会更新第一个匹配的文件:

{ "_id" : ObjectId("57055d25b98ee40de403824d"), "name" : "john", "sport" : "football", "language" : "english", "points" : 20 }
{ "_id" : ObjectId("57055d6cb98ee40de403824f"), "name" : "john", "sport" : "baseball", "language" : "english" }

如果我们要更新所有匹配的文档,那么我们需要为更新函数“multi”提供第三个参数,并将其设置为true。 其默认值为false:

db.people.update({"name" : "john"}, {$set : {"points" : 22}}, {multi : true})

结果如下:

{ "_id" : ObjectId("57055d25b98ee40de403824d"), "name" : "john", "sport" : "football", "language" : "english", "points" : 22 }
{ "_id" : ObjectId("57055d6cb98ee40de403824f"), "name" : "john", "sport" : "baseball", "language" : "english", "points" : 22 }

这里是另一个例子,我们将每个人的积分增加5,当前点数至少为10:

db.people.update({"points" : {$gt : 10}}, {$inc : {"points" : 5}},{multi : true})

只有阿卜杜勒才开始不到8分。 两个约翰斯和苏珊将获得5个额外分数,其他人被忽略,因为他们目前没有积分。

如果我想更新集合中的每一个文档怎么办? 我们可以提供一个空的搜索参数。 这类似于SQL UPDATE语句中缺少的WHERE子句:

db.people.update({}, {$inc : {"points" : 5}},{multi : true})

所有6人将获得5点积分。 所以现在都有一个“积分”的财产。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/10.html