MongoDB没有创建数据库的命令,但是你可以先运行use db_name
来进行一些操作,如db.createCollection('db_table')
,这样就可以创建一个db_name
的数据库了。
以下语句其实都不用加引号
增
insert方法
insert(obj)
> db.test.insert({'name':'bing'})
WriteResult({ "nInserted" : 1 })
批量插入
> db.test.insert([{'id':0},{'id':1},{'id':2}])
WriteResult({ "nInserted" : 1 })
插入效验
文件必须小于16M,如果没有’_id’字段,就自动添加一个。
删
remove(query)
db.test.remove({'_id': 1})
删除文档
db.test.remove({})
删除速度
删除文档通常很快,但是如果要清空整个集合,那么使用drop
直接删除集合会更快(然后在这个空集合上重建各项索引)。
改
update(query, object[, upsert_bool, multi_bool])
两个必选的参数:
1. 查询文档,用于定位需要更新的目标文档
2. 修改器文档,用于说明要对找到的文档进行哪些修改
更新操作是不可分割的:若是两个更新同时发生,先到达服务器的先执行,接着执行另外一个。
简单的更改:
db.test.update({'name':'Bing'}, {$set: {'name':'Lau'}})
其中后者便是所谓的修改器文档
还有一种方式,取出文档再进行修改:
> var Lau = db.test.findOne({'name': 'Lau'})
> Lau
{ "_id" : ObjectId("55015e0d73bfaf0168aa1871"), "name" : "Lau", "arg" : 22 }
> Lau.name
Lau
> Lau.name = 'Bing'
Bing
> Lau.relationships = { 'friends' : 31, 'enemies': 3};
{ "friends" : 31, "enemies" : 3 }
> db.test.update({'name':'Lau'}, Lau);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.findOne()
{
"_id" : ObjectId("55015e0d73bfaf0168aa1871"),
"name" : "Bing",
"arg" : 22,
"relationships" : {
"friends" : 31,
"enemies" : 3
}
}
修改器
有这么几种:
1. '$set'
用来指定一个字段,如果不存在则创建它
db.test.update({'name':'Bing'}, {$set: {'name':'Lau'}})
2. '$unset'
删除
db.test.update({'name':'Bing'}, {'$unset':{'arg':1}})
3. $inc
修改器用来增加(或负数减少)已有键的值,或者该键不存在那就创建一个。
db.test.update({'name':'Bing'}, {'$inc':{'score':59}})
4. $push
向已有的数组末尾加入一个元素,要是没有就创建一个新的数组
db.test.update({'name':'Bing'}, {'$push':{'job':'隔壁卖瓜'}})
使用$each
子操作符,可以通过依次$push
操作添加多个值
db.test.update({'name':'Bing'}, {'$push':{'job':{'$each':['贴膜','file']}}})
如果希望数组的最大长度是固定的,那么可以将$slice
和$push
组合在一起使用。这样就可以保证数组不会超过设定号的最大长度,这实际上就得到了一个最多包含N个元素的数组:
db.test.update({'name':'Bing'}, {'$push':{'top3':{'$each':[1, 2, 3, 4], '$slice': -3}}})
实际就是截取最后3个
最后可以在清理元素之前使用$sort
,只要向数组中添加子对象就需要清理:没怎么看懂这个- -
5. 使用$ne
和$addToSet
实现数组内元素不会重复
6. 若将数组看为队列或者栈可以使用$pop
可以从数组任意一端删除元素,{'$pop':{'key':1}}
从数组末尾删除一个元素,-1
自然是开头
7. 有时需要基于特定条件来删除元素,而不仅仅是根据元素位置,这时可以使用$pull
。
db.test.update({}, {$pull:{' skill':'PHP'}})
8. 两个操作数组中的值的方法:通过位置或者定位操作符('$')
9. 设置update
中的upsert
可以使得没有找到符合更新条件的文档会以这个条件和更新创建一个新的文档。
10. 最后一个参数是是否更新多个匹配的文档
查
db.test.find([query],[fields])
匹配{}
查找全部,query
可加入限定条件,fields
是指定想要的键,使用1
表示确认,使用0
表示剔除。
查询使用上有些限制,传递给数据库的查询文档的值必须是常量。query
可以加入查询条件(普通的指定值相当与相等),常用的查询条件有:
- 比较操作符:
$lt
,$lte
,$gt
,$gte
- OR查询:
$in
(find({'ticket_no':{'$in':[725,542,390}})
),$nin
,$or
(find({'$or': [{'ticket_no':725}, {'winner':true}])
) $not
$and
,也可以是{}
包裹的
- 比较操作符:
- 对于检查
null
不仅要匹配null
还要使用$exists
(find({z:{$in:[null], $exists}:true})
) - 正则表达式
- 查询数组:
$all
都存在才匹配$size
查询特定长度的数组$slice
可以返回某个键匹配的数组元素的子集(find(criteria, {comments:{$slice:10}}))
- 查询内嵌文档:查询整个文档,或者只针对其键/值对进行查询。
$where
,它几乎可以在查询中做任何使其,为了安全起见,应该严格限制或者消除$where
语句的使用。
db.myCollection.find( { $where: "this.credits == this.debits" } );
db.myCollection.find( { $where: "obj.credits == obj.debits" } );
db.myCollection.find( { $where: function() { return (this.credits == this.debits) } } );
db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
游标
数据库使用游标返回find
的执行结果。
典型的结果遍历如下所示:
while(cursor.hasNext()){
obj = cursor.next();
//do stuff
}
还可以这样来:
cursor.forEach(function(x){
print(x.name);
});
常用查询选项:
1. 限制返回结果的数量:$limit
2. 忽略一定数量的结果:$skip
3. 排序:$sort
(接收一个对象作为参数,这个对象是一组键/值对,键对应文档的键名,值代表排序的方向。排序方向可以是1(升序),-1(降序。如果指定了多个键,则按照这些键被指定的顺序逐个排序))。