mongoDB 特别指令用法

http://apluck.iteye.com/blog/1176160 a.   修改collection集合字段名

参见:http://www.mongodb.org/display/DOCS/Updating#Updating-%24rename

例:

Shell代码  
 db.test.find()  

 查出如下数据:

Shell代码  
 { "_id" : ObjectId("4e787a369748ed04b7c19b0f"), "abc" : "123" }  

 现,需要将字段"abc"改为"def",执行如下命令:

Shell代码  
 db.test.update({}, {$rename : {"abc" : "def"}}, false, true)  

 即可。

ps:如果数据量比较大的话,不会马上将所有数据的column名称重命名,需要执行时间

b.   in查询
Shell代码  
db.col.find({"_id":{$in:[1,2,3,4...]}})
[1,2,3..]数组。
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.members.update({'name':'hurry'},{'$addToSet':{'skills':'python'}})

> db.members.find()                                                    

{ "_id" : ObjectId("4e11b35ec25a7683c014d96a"), "age" : 22, "name" : "hurry", "skills" : [ "java", "js", "python" ], "title" : "software developer" }

$each一次添加多个

> db.members.update({'name':'hurry'},{'$addToSet':{'skills':{$each:['python','mongoDB','PL/SQL']}}})

> db.members.find()                                                                                 

{ "_id" : ObjectId("4e11b35ec25a7683c014d96a"), "age" : 22, "name" : "hurry", "skills" : [ "java", "js", "python", "PL/SQL", "mongoDB" ], "title" : "software developer" }


增加一个值到数组内,而且只有当这个值不在数组内才增加。例:
> 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 ] }

转载于:https://www.cnblogs.com/svennee/p/4080842.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌大脑的“世界模型”简述与启发

来源:David9的个人博客摘要:我们的视觉看到什么,部分取决于大脑预测未来会看到什么。我们的视觉看到什么,部分取决于大脑预测未来会看到什么,例如下图中,如果你预计要看到突出的球体,那也许你就…

跳台阶算法简单分析

题目为: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 分析: N级(N-1)级的情况(N-2)级的情况。 因为两种情况都可以选择&am…

我为什么在这里写博客

做了几年的程序员,学了一些技能,电脑里的资料也越来越多,一直没有去梳理。每次看别人的博客,特别是写得好的博客,心里就痒痒的。也希望把自己的东西整理出来,一来可以给自己所学一个交代,二来可…

TensorFlow的基本介绍及Hello,world

转载自: http://www.tensorfly.cn/tfdoc/get_started/basic_usage.html https://blog.csdn.net/sarsscofy/article/details/78541836 ####基本使用: 使用(graph)来表示计算任务在被称之为 会话 (Session) 的上下文 (context) 中执行图.使用 tensor 表示…

中美首份8000字长文解析全球热点脑机接口(重磅干货)

来源:硅谷密探摘要:“我们所想象的一切,都会变为现实。”如果说当今什么技术最接近科幻,那么一定是脑机接口。脑机接口的研究已经实现了意识打字(1分钟之内平均输入39个字母),还实现了心灵控制&…

C# WinForm程序退出的方法

1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出; 2.Application.Exit(); 强制所有消息中止,退出所有的窗体…

深度学习-KNN,K近邻算法简介

参考:https://blog.csdn.net/xundh/article/details/73611249 包括算法解释、代码和数据集。 还有:https://blog.csdn.net/dugudaibo/article/details/78304540

一文读懂2019年IT及大数据行业趋势

来源:智慧网点建设运营2018即将过去,今年区块链、5G、芯片、量子计算成为大家不断提及的技术重点,明年大数据科学还会有哪些发展方向,IT行业还有哪些发展趋势?众多机构针对未来产业发展做出预测,小编整理如…

mysql truncate table命令使用总结

truncate使用注意由于上过truncate table a_table命令一次当,将教训记录下来,以示警戒!mysql truncate table a_table命令受影响结果说明,亲身体验 命令truncate table a_table;会将执行表中的数据删除,有增长ID值的话…

openMP的简单使用

安装,参考:https://blog.csdn.net/augusdi/article/details/8808226 如图所示,右键工程名->属性->C/C>语言,找到OpenMP支持,更改设置即可。 代码编程,参考:https://blog.csdn.net/zh…

车联网系统会不会只是智能手机系统的翻版?

来源:智能相对论摘要:对于当前大热的车联网技术,各家车企都像“王婆卖瓜”一样夸赞自己,在一片叫好声中,我们需要厘清一个问题,车联网系统到底是不是“另一个”智能手机系统?在BAT集体入局车联网…

mybatis大于小于的转义

今天在写代码时&#xff0c;由于业务&#xff0c;须要在mybatis中&#xff0c;使用到大于号&#xff0c;小于号&#xff0c;所以就在SQL中直接使用了。SELECT * FROM test WHERE 1 1 AND start_date < CURRENT_DATE AND end_date > CURRENT_DATE但是&#xff0c;在运行时…

清华、中科大实现了量子版本的GAN,平均保真度98.8%

作者&#xff1a;Ling Hu等编译&#xff1a;机器之心 刘晓坤、张倩摘要&#xff1a;清华和中科大的研究者在 Science Advances 上发表论文&#xff0c;他们在超导量子电路上实现了第一个生成对抗学习的原理验证&#xff0c;即量子版本的 GAN。实验中生成的单个 qubit 的平均保真…

RMQ求区间最值 nlog(n)

转载于&#xff1a;http://blog.csdn.net/xuzengqiang/article/details/7350465 RMQ算法全称为(Range Minimum/Maximum Query)意思是给你一个长度为n的数组A,求出给定区间的最值的下标。当然我们可以采用枚举&#xff0c;但是我们也可以使用线段树来优化&#xff0c;复杂度为(n…

一个令人心醉的谜题——DNA和RNA是如何演化出美妙的螺旋结构?

来源&#xff1a;原理丨公众号在现代科学中&#xff0c;一直存在一个匪夷所思到令无数科学家心醉的谜题——DNA和RNA究竟是如何演化出这种美妙的螺旋结构的&#xff1f;最近&#xff0c;佐治亚理工学院的一组研究人员在超分子聚合物的形成过程中&#xff0c;发现了一种全然自发…

Jacobi迭代法

我们在求解矩阵时&#xff0c;有很多种方法&#xff0c;其中当矩阵是大型稀疏矩阵&#xff08;矩阵中有大部分元素都为0&#xff09;时&#xff0c;我们可以用迭代法求解。 其中Jacobi迭代法就是很简单易懂的一种。 我编写的C代码如下&#xff0c;其中文件matrix.txt内容如下…

AI人才「用工荒」如何解决?看看这几家顶级公司的应对策略

来源&#xff1a; Forbes编译&#xff1a; 机器之心 太浪在未来几年&#xff0c;人工智能可能会成为众多行业的战略选择&#xff0c;但有一个重大的挑战&#xff1a;招人。如何避免招募 AI 人才的误区&#xff1f;这里有来自几家顶级公司的建议。招到 AI 人才后&#xff0c;可能…

单应矩阵的解释

参考博客&#xff1a; https://www.cnblogs.com/wangguchangqing/p/8287585.html https://blog.csdn.net/jay463261929/article/details/53611363

学习网址积累

ecshop120.com ecshop的学习开发网址 68ecshop 转载于:https://www.cnblogs.com/ymj0906/p/4088749.html

AI芯片混战,谁能挑战英伟达?

来源&#xff1a;forbes我准备写一篇预测未来一年的AI芯片&#xff0c;以及英伟达如何应对挑战的文章&#xff0c;但我很快意识到&#xff0c;文章要比我预期的要长得多。由于有很多内容要介绍&#xff0c;我决定把文章分为3个部分。第1部分&#xff1a;简介&#xff0c;以及分…