MongoDB增删查改

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. 最后一个参数是是否更新多个匹配的文档

  1. db.test.find([query],[fields])匹配{}查找全部,query可加入限定条件,fields是指定想要的键,使用1表示确认,使用0表示剔除。
    查询使用上有些限制,传递给数据库的查询文档的值必须是常量。
  2. query可以加入查询条件(普通的指定值相当与相等),常用的查询条件有:
    1. 比较操作符:$lt, $lte, $gt, $gte
    2. OR查询:$in(find({'ticket_no':{'$in':[725,542,390}})),$nin$or(find({'$or': [{'ticket_no':725}, {'winner':true}]))
    3. $not
    4. $and,也可以是{}包裹的
  3. 对于检查null不仅要匹配null还要使用$existsfind({z:{$in:[null], $exists}:true})
  4. 正则表达式
  5. 查询数组:
    1. $all都存在才匹配
    2. $size查询特定长度的数组
    3. $slice可以返回某个键匹配的数组元素的子集(find(criteria, {comments:{$slice:10}}))
    4. 查询内嵌文档:查询整个文档,或者只针对其键/值对进行查询。
  6. $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(降序。如果指定了多个键,则按照这些键被指定的顺序逐个排序))。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值