一、shell命令
1、mongo是个JavaScript shell,可以直接执行javascript代码。shell本身也内置了帮助文档,可以通过help命令查看;db.help()查看数据库级别命令,集合的命令可以通过db.foo.help()查看;
2、在输入函数的时候不输入括号就可以看到javascript源码;
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位的字符串。
生成方式如下图:
时间戳从标准纪元开始,单位为秒。
“机器” 就是主机名的散列值,为了确保不同主机不冲突为分布式而生。查看上一份笔记Mongo-Cola的截图,看到第9-14位即为我的主机名散列值,为:134994
四、修改器
1、“$inc” ----> db.entities.update({name:"xue"},{"$inc":{id:1}}) 计数器修改
只能用于整数、长整数或双精度浮点数,其它类型都会操作失败;所更新的值也只能为数字,否则报错。
修改飞数字值报错:
2、“$set” ----> db.entities.update({"id":2},{"$set":{"age":56}}) 用来指定一个键的值,如果键不存在则创建它。
对应的, “$unset”可以将键完全删除
3、“$push” 会向已有的数组末尾加入一个元素,没有则创建新的数组。
4、"$ne" 如果一个值不在数组里面就把它加进去
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 }