热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB数据库update命令的使用方法

在前面的文章“mongodb查询的语法”里,我介绍了Mongodb的常用查询语法,Mongodb的update操作也有点复杂,我结合自己的使用经验,在这里介绍一下,给用mongodb的朋友看看,也方便以后自己用到的时候查阅:注:在这篇文章及上篇文章内讲的语法介绍都是在mong

在前面的文章“mongodb 查询的语法”里,我介绍了Mongodb的常用查询语法,Mongodb的update操作也有点复杂,我结合自己的使用经验,在这里介绍一下,给用mongodb的朋友看看,也方便以后自己用到的时候查阅:

注:在这篇文章及上篇文章内讲的语法介绍都是在mongodb shell环境内的,和真正运用语言编程(如java,php等)使用时,在使用方法上会有一些差别,但语法(如查询条件,$in,$inc等)是一样的。

本文是参考官方文档来介绍的,之所以有官方文档还要在这介绍,一方面是就当翻译,毕竟每次要用时去看英文文档比较累,第二是官方文档讲解比较简单,有时光看官方文档不好理解,我在实际操作的情况下可以做些补充。

好了,不多说了,下面正式开始:

mongodb更新有两个命令:

1).update()命令

db.collection.update( criteria, objNew, upsert, multi )

criteria : update的查询条件,类似sql update查询内where后面的
objNew : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

例:
db.test0.update( { “count” : { $gt : 1 } } , { $set : { “test2″ : “OK”} } ); 只更新了第一条记录
db.test0.update( { “count” : { $gt : 3 } } , { $set : { “test2″ : “OK”} },false,true ); 全更新了
db.test0.update( { “count” : { $gt : 4 } } , { $set : { “test5″ : “OK”} },true,false ); 只加进去了第一条
db.test0.update( { “count” : { $gt : 5 } } , { $set : { “test5″ : “OK”} },true,true ); 全加进去了
db.test0.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );全更新了
db.test0.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );只更新了第一条

2).save()命令

db.collection.save( x )

x就是要更新的对象,只能是单条记录。

如果在collection内已经存在一个和x对象相同的”_id”的记录。mongodb就会把x对象替换collection内已经存在的记录,否则将会插入x对象,如果x内没有_id,系统会自动生成一个再插入。相当于上面update语句的upsert=true,multi=false的情况。

例:
db.test0.save({count:40,test1:”OK”}); #_id系统会生成
db.test0.save({_id:40,count:40,test1:”OK”}); #如果test0内有_id等于40的,会替换,否则插入。

mongodb的更新操作符:

1) $inc

用法:{ $inc : { field : value } }

意思对一个数字字段field增加value,例:

> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 16, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $inc : { “count” : 1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 17, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $inc : { “count” : 2 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 19, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $inc : { “count” : -1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

2) $set

用法:{ $set : { field : value } }

就是相当于sql的set field = value,全部数据类型都支持$set。例:
> db.test0.update( { “_id” : 15 } , { $set : { “test1″ : “testv1″,”test2″ : “testv2″,”test3″ : “testv3″,”test4″ : “testv4″ } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : “testv1″, “test2″ : “testv2″, “test3″ : “testv3″, “test4″ : “testv4″, “test5″ : “OK” }

3) $unset

用法:{ $unset : { field : 1} }

顾名思义,就是删除字段了。例:
> db.test0.update( { “_id” : 15 } , { $unset : { “test1″:1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test2″ : “testv2″, “test3″ : “testv3″, “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $unset : { “test2″: 0 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test3″ : “testv3″, “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $unset : { “test3″:asdfasf } } );
Fri May 14 16:17:38 JS Error: ReferenceError: asdfasf is not defined (shell):0

> db.test0.update( { “_id” : 15 } , { $unset : { “test3″:”test” } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test4″ : “testv4″, “test5″ : “OK” }

没看出field : 1里面的1是干什么用的,反正只要有东西就行。

4) $push

用法:{ $push : { field : value } }

把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。例:

> db.test0.update( { “_id” : 15 } , { $set : { “test1″ : ["aaa","bbb"] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb" ], “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $push : { “test1″: “ccc” } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $push : { “test2″: “ccc” } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc" ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $push : { “test1″: ["ddd","eee"] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

5) $pushAll

用法:{ $pushAll : { field : value_array } }

同$push,只是一次可以追加多个值到一个数组字段内。例:

> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $pushAll : { “test1″: ["fff","ggg"] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ], “fff”, “ggg” ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

6) $addToSet

用法:{ $addToSet : { field : value } }

增加一个值到数组内,而且只有当这个值不在数组内才增加。例:
> db.test0.update( { “_id” : 15 } , { $addToSet : { “test1″: {$each : ["444","555"] } } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"
],
“fff”,
“ggg”,
[
"111",
"222"
],
“444″,
“555″
], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }
> db.test0.update( { “_id” : 15 } , { $addToSet : { “test1″: {$each : ["444","555"] } } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"
],
“fff”,
“ggg”,
[
"111",
"222"
],
“444″,
“555″
], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }
> db.test0.update( { “_id” : 15 } , { $addToSet : { “test1″: ["444","555"] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"
],
“fff”,
“ggg”,
[
"111",
"222"
],
“444″,
“555″,
[
"444",
"555"
]
], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }
> db.test0.update( { “_id” : 15 } , { $addToSet : { “test1″: ["444","555"] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"
],
“fff”,
“ggg”,
[
"111",
"222"
],
“444″,
“555″,
[
"444",
"555"
]
], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

7) $pop

删除数组内的一个值

用法:
删除最后一个值:{ $pop : { field : 1 } }

删除第一个值:{ $pop : { field : -1 } }

注意,只能删除一个值,也就是说只能用1或-1,而不能用2或-2来删除两条。mongodb 1.1及以后的版本才可以用,例:
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [
"bbb",
"ccc",
[
"ddd",
"eee"
],
“fff”,
“ggg”,
[
"111",
"222"
],
“444″
], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }
> db.test0.update( { “_id” : 15 } , { $pop : { “test1″: -1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [
"ccc",
[
"ddd",
"eee"
],
“fff”,
“ggg”,
[
"111",
"222"
],
“444″
], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }
> db.test0.update( { “_id” : 15 } , { $pop : { “test1″: 1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "ccc", [ "ddd", "eee" ], “fff”, “ggg”, [ "111", "222" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″,
“test5″ : “OK” }

8) $pull

用法:$pull : { field : value } }

从数组field内删除一个等于value值。例:
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "ccc", [ "ddd", "eee" ], “fff”, “ggg”, [ "111", "222" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″,
“test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $pull : { “test1″: “ggg” } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "ccc", [ "ddd", "eee" ], “fff”, [ "111", "222" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″
: “OK” }

9) $pullAll

用法:{ $pullAll : { field : value_array } }

同$pull,可以一次删除数组内的多个值。例:
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "ccc", [ "ddd", "eee" ], “fff”, [ "111", "222" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″
: “OK” }

> db.test0.update( { “_id” : 15 } , { $pullAll : { “test1″: [ "ccc" , "fff" ] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ [ "ddd", "eee" ], [ "111", "222" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

10) $ 操作符

$是他自己的意思,代表按条件找出的数组里面某项他自己。呵呵,比较坳口。看一下官方的例子:

> t.find()
{ “_id” : ObjectId(“4b97e62bf1d8c7152c9ccb74″), “title” : “ABC”, “comments” : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }

> t.update( {‘comments.by’:'joe’}, {$inc:{‘comments.$.votes’:1}}, false, true )

> t.find()
{ “_id” : ObjectId(“4b97e62bf1d8c7152c9ccb74″), “title” : “ABC”, “comments” : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

需要注意的是,$只会应用找到的第一条数组项,后面的就不管了。还是看例子:

> t.find();
{ “_id” : ObjectId(“4b9e4a1fc583fa1c76198319″), “x” : [ 1, 2, 3, 2 ] }
> t.update({x: 2}, {$inc: {“x.$”: 1}}, false, true);
> t.find();

还有注意的是$配合$unset使用的时候,会留下一个null的数组项,不过可以用{$pull:{x:null}}删除全部是null的数组项。例:
> t.insert({x: [1,2,3,4,3,2,3,4]})
> t.find()
{ “_id” : ObjectId(“4bde2ad3755d00000000710e”), “x” : [ 1, 2, 3, 4, 3, 2, 3, 4 ] }
> t.update({x:3}, {$unset:{“x.$”:1}})
> t.find()
{ “_id” : ObjectId(“4bde2ad3755d00000000710e”), “x” : [ 1, 2, null, 4, 3, 2, 3, 4 ] }

{ “_id” : ObjectId(“4b9e4a1fc583fa1c76198319″), “x” : [ 1, 3, 3, 2 ] }


推荐阅读
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • SQL中UPDATE SET FROM语句的使用方法及应用场景
    本文详细介绍了SQL中UPDATE SET FROM语句的使用方法,通过具体示例展示了如何利用该语句高效地更新多表关联数据。适合数据库管理员和开发人员参考。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 探讨如何优化MongoDB数据库在长时间未访问后首次查询时的性能问题,提供多种解决方案和最佳实践。 ... [详细]
author-avatar
妈妈的话CPC-8_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有