一、shell命令

1、mongo是个JavaScript shell,可以直接执行javascript代码。shell本身也内置了帮助文档,可以通过help命令查看;db.help()查看数据库级别命令,集合的命令可以通过db.foo.help()查看;


2、在输入函数的时候不输入括号就可以看到javascript源码;

MongoDB的shell mongodb的shell命令Java jpi_数组


3、db.集合名 是来访问集合的,但当集合名称和mongodb库函数冲突或者不能被javascript正常解析时,可以使用getCollection函数;

     如果集合名字和库函数相同,就会返回属性。(js先查找属性,找不到时才去找集合);

   比如:如果有version这样的集合,db.version只会返回此函数代码,用db.getCollection("version")就可以得到集合;如果有test-menu这个集合名,会被javascript解释为相减,此时,应该用db.getCollection("test-menu")


二、Mongodb数据类型

前面是数据类型,后面是shell表示

1、null   ----> {"x" : null}

2、bool  ----> {"x": true}, {"x": false}

3、32/64位整数,64位浮点数  ----->   {"x": 5.29},{"x":3}  。 ps: javascript仅支持64位浮点数,其它将被自动转换为此类型

4、字符串   -----> {“x”:"test"}   UTF8类型

5、对象id  ----->  {"x":ObjectId()}

6、日期  ----->  {"x":new Date()}

7、符号   ---->  shell不支持

8、正则   -----> {“x”: /abc/i}

9、代码   -----> {"x":function(){ /* ... */ }}

10、二进制数据   -----> shell中无法使用

11、最大值/最小值(BSON的特殊类型)   ---> shell中没有

12、未定义   -----> {"x":undefined}

13、数组   ----> {"x": ["a", "b", "c"]}

14、内嵌文档   ----> {"x" : {"foo":"bar"}}


三、objectId

占用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。

生成方式如下图:

MongoDB的shell mongodb的shell命令Java jpi_javascript_02


时间戳从标准纪元开始,单位为秒。

“机器” 就是主机名的散列值,为了确保不同主机不冲突为分布式而生。查看上一份笔记Mongo-Cola的截图,看到第9-14位即为我的主机名散列值,为:134994


四、修改器

1、“$inc”  ---->  db.entities.update({name:"xue"},{"$inc":{id:1}})                     计数器修改

只能用于整数、长整数或双精度浮点数,其它类型都会操作失败;所更新的值也只能为数字,否则报错。

MongoDB的shell mongodb的shell命令Java jpi_javascript_03

修改飞数字值报错:

MongoDB的shell mongodb的shell命令Java jpi_javascript_04


2、“$set”  ----> db.entities.update({"id":2},{"$set":{"age":56}})   用来指定一个键的值,如果键不存在则创建它。

MongoDB的shell mongodb的shell命令Java jpi_数组_05

对应的, “$unset”可以将键完全删除


3、“$push” 会向已有的数组末尾加入一个元素,没有则创建新的数组。

MongoDB的shell mongodb的shell命令Java jpi_浮点数_06

4、"$ne"  如果一个值不在数组里面就把它加进去

MongoDB的shell mongodb的shell命令Java jpi_数组_07

5、“$addToSet”  同4


6、“$pop”  从数组中删除元素

{$pop:{key:1}} 从数组末尾删除一个元素,{$pop:{key:-1}}从头部删除


7、"$pull"  会将所有匹配的元素删除

比如数组 [1,2,1,1]执行pull 1,得到的结果是只有一个元素的数组[2]


8、定位符 “$”   定位查询文档已匹配的元素并进行更新。

db.b.insert(
{
"content":"haha",
"conmments":[
	{
		"conmment":"nice",
		"author":"shawn",
		"votes":0
	},
	{
		"conmment":"just so so",
		"author":"alex",
		"votes":8
	},
	{
		"conmment":"very useful",
		"author":"lucy",
		"votes":-1
	}
]
}
)



要更新作者为“alex”的名字为"alexander",使用下面就可以了(comments写错了,汗):

> db.b.update({"conmments.author":"alex"}, {"$set":{"conmments.$.author":"alexander"}})

更新后的结果(第二条评论的author变为“alexander”):

{ "_id" : ObjectId("5506ae597ea6fc3edf111043"), "content" : "haha", "conmments": [ { "conmment" : "nice", "author" : "shawn", "votes" : 0 }, { "conmment" : "just so so", "author" : "alexander", "votes" : 8 }, { "conmment" : "very useful", "author" : "lucy", "votes" : -1 } ] }



注:”$“只更新匹配到的第一条元素。


9、upsert  (update函数的第三个参数), 如果没有符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。

  例:

db.a.update({"total":103}, {"$inc":{"total":1}}, true)

这里a是一个空集合,代码含义是找到"total"值为103的文档,将其值加1,但是由于空集合,所以创建了这个文档,然后给total的值加1,然后将其保存。

结果:

{ "_id" : ObjectId("55040c712c519488bb4da0ba"), "total" : 104 }