mongodb基本操作

知识补充:
唯一要讲的一点就是mongodb中有三元素:数据库,集合,文档,其中“集合”
就是对应关系数据库中的“表”,“文档”对应“行”。好,话不多说,直接操作。。

 

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Users\acer>mongo
'mongo' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Users\acer>d:

D:\>cd D:\mongodb\mongodb-win32-i386-2.4.8\bin

D:\mongodb\mongodb-win32-i386-2.4.8\bin>mongo
MongoDB shell version: 2.4.8
connecting to: test
Server has startup warnings:
Tue Jan 07 11:03:22.820 [initandlisten]
Tue Jan 07 11:03:22.820 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
Tue Jan 07 11:03:22.820 [initandlisten] **       32 bit builds are limited to less than 2GB of data (or less with --jour
nal).
Tue Jan 07 11:03:22.820 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.
Tue Jan 07 11:03:22.820 [initandlisten] **       See http://dochub.mongodb.org/core/32bit
Tue Jan 07 11:03:22.820 [initandlisten]

一>find操作:
日常开发中,我们玩查询,玩的最多的也就是二类:
     ①: >, >=, <, <=, !=, =。
     ②:And,OR,In,NotIn
这些操作在mongodb里面都封装好了,下面就一一介绍:

<1>:"$gt", "$gte", "$lt", "$lte", "$ne", "没有特殊关键字",这些跟上面是一一对应的,实例如下:

> db.person.find()
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
> find({age:{$gt221}})
Tue Jan 07 12:06:28.866 SyntaxError: Unexpected token }
> find({age:{$gt:221}})
Tue Jan 07 12:06:49.725 ReferenceError: find is not defined
> db.person.find({age:{$gt:221}})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
> db.person.find({age:{$gte:221}})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
> db.person.find({age:{$lte:221}})
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
> db.person.find({age:{$lt:221}})
> db.person.find({age:{$ne:221}})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
> db.person.find({age:{$e:221}})
error: { "$err" : "invalid operator: $e", "code" : 10068 }
> db.person.find({age:221})
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
>

<2>:And,OR,In,NotIn

> db.person.find({age:221,age:322})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
> db.person.find({age:221,name:"caicai"})
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
> var single={name:"cai",age:22,birthday:"2013-12-21",gender:"boy"}
> db.person.insert(single)
> db.person.find()
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
> db.person.find({$or:[{name:"cai"},{name:"caicai"}]})
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
> db.person.find({name:{$in:["cai","caicai"]}})
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
> db.person.find({name:{$nin:["cai","caicai"]}})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
>

<3>正则表达式(本人对正则用的不多啊。惭愧)
> db.person.find({"name":/^c/,"name":/j$/})
>

<4>添加条件语句:$where,$where中的value就是我们非常熟悉,的js。
> db.person.find({$where:function(){return this.name=="jack"}})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
> db.person.find({$where:function(){}})
> db.person.find({$where:function(){return this.age==221}})
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
> db.person.find({$where:function(){return this.age$gle:221}})
Tue Jan 07 14:15:43.799 SyntaxError: Unexpected token :

$gte与$where的搭配使用。
> db.person.find({$where:function(){return {age:{$gte:221}}}})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
>

 

<二>:insert操作:mongodb文档是采用“K-V”格式存储的,如果大家对JSON比较熟悉的话,学mongodb是手到擒来,我们知道JSON里面Value

可能是“字符串”,可能是“数组”,又有可能是内嵌的一个JSON对象,相同的方式也适合于BSON。常见的插入操作也就两种形式存在:“单条插入”和“批量插入”。

1> 单条插入:mongo命令打开的是一个javascript shell。所以js的语法在这里面都行得通
> var single={"name":"helloworld","age":33,"birthday":{"birthday":"2013-12-22"},"gender":"man"}
> db.person.insert(single)
> db.person.find()
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 322 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
{ "_id" : ObjectId("52cb9db05f43f6ce2ec9788b"), "name" : "helloworld", "age" : 33, "birthday" : { "birthday" : "2013-12-
22" }, "gender" : "man" }
>
2>批量插入:由于mongodb中没有提供给shell的“批量插入方法”,没关系,各个语言的driver都打通了跟mongodb内部的批量插入方法,因为该方法是不可或缺的,如果大家非要

模拟下批量插入的话,可以自己写了for循环,里面就是insert(暂时不知道怎么弄,知道的朋友方便的话,请评论啊)

 

<三>:update操作:分为整体更新和局部更新

1):整体更新
> var model=db.person.findOne({"name":"jack"})
> model.age=10
10
> db.person.update({"name":"jack",model})
Tue Jan 07 14:31:59.215 SyntaxError: Unexpected token }
> db.person.update({"name":"jack"},model)
> db.person.find({"name":"jack"})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 10 }
>

2):局部更新
 有时候我们仅仅需要更新一个字段,而不是整体更新,那么我们该如何做呢?easy的问题,mongodb中已经给我们提供了两个
 修改器: $inc 和 $set。

   ①  $inc修改器

       $inc也就是increase的缩写,学过sql server 的同学应该很熟悉,比如我们做一个在线用户状态记录,每次修改会在原有的基础上

    自增$inc指定的值,如果“文档”中没有此key,则会创建key,下面的例子一看就懂(网上是这样子做的,但是我表示没看懂)。下面是操作结果:

> db.person.update({"name":"jack"},{$inc:{"age":99}})
> db.person.find({"name":"jack"})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 109 }
>
仔细看来结果,唉,神了!我刚开始age=10,然后改为99,尼玛的,给我显示109出来。原来这就是所谓的局部更新啊,我靠,明明就是加法运算嘛。还是似懂非懂。

   ② $set修改器
> db.person.update({"name":"jack"},{$set:{"age":10}})
> db.person.find({"name":"jack"})
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "name" : "jack", "age" : 10 }
>
哦,看了上面的结果,貌似懂了。$inc是在原来的基础上加上后来的,$set是直接设置为后面的内容。我靠,太神了。。。

3) upsert操作:
这个可是mongodb创造出来的“词”,大家还记得update方法的第一次参数是“查询条件”吗?,那么这个upsert操作就是说:如果我

没有查到,我就在数据库里面新增一条,其实这样也有好处,就是避免了我在数据库里面判断是update还是add操作,使用起来很简单

将update的第三个参数设为true即可。哈哈,不多说了,直接上代码:

> db.person.upsert({"name":"jack"},{"age":22222},true)
Tue Jan 07 14:48:39.642 TypeError: Property 'upsert' of object test.person is not a function
神马情况?
没有upsert这个函数,nnd。被坑了。原来还是update(),看来看东西要仔细才行,不能够太鸡冻啊。
> db.person.upset({"name":"jack"},{"age":22222},true)
Tue Jan 07 14:48:54.540 TypeError: Property 'upset' of object test.person is not a function
> db.person.update({"name":"jack"},{"age":22222},true)
> db.person.find({"name":"jack"})
> db.person.find()
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "age" : 22222 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
{ "_id" : ObjectId("52cb9db05f43f6ce2ec9788b"), "name" : "helloworld", "age" : 33, "birthday" : { "birthday" : "2013-12-
22" }, "gender" : "man" }
>

4)批量更新:
在mongodb中如果匹配多条,默认的情况下只更新第一条,那么如果我们有需求必须批量更新,那么在mongodb中实现也是很简单
的,在update的第四个参数中设为true即可。好,直接操作。

> db.person.update({"age":{$gt:201}},{"age":00},true,true)
multi update only works with $ operators
> db.person.find()
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "age" : 22222 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 221, "birthday" : "2013-12-12", "gender" : "g
irl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
{ "_id" : ObjectId("52cb9db05f43f6ce2ec9788b"), "name" : "helloworld", "age" : 33, "birthday" : { "birthday" : "2013-12-
22" }, "gender" : "man" }
{ "_id" : ObjectId("52cba4a25f43f6ce2ec9788c"), "age" : 0 }
{ "_id" : ObjectId("52cba4f35f43f6ce2ec9788d"), "name" : "jack", "age" : 201 }
> db.person.update({"age":{$gt:201}},{"age":88},true,true)
multi update only works with $ operators
这是什么原因啊,肯定是没有成功的。上网百度一下,发现也有挺多人在问这个问题。原来是我没有设置更新的内容。所以改为以下:
> db.person.update({"age":{$gt:201}},{$set:{"age":99}},true,true)
> db.person.find()
{ "_id" : ObjectId("52c1336fd4316223f01eb912"), "age" : 99 }
{ "_id" : ObjectId("52c134a5d4316223f01eb913"), "name" : "caicai", "age" : 99, "birthday" : "2013-12-12", "gender" : "gi
rl" }
{ "_id" : ObjectId("52cb80a65f43f6ce2ec9788a"), "name" : "cai", "age" : 22, "birthday" : "2013-12-21", "gender" : "boy"
}
{ "_id" : ObjectId("52cb9db05f43f6ce2ec9788b"), "name" : "helloworld", "age" : 33, "birthday" : { "birthday" : "2013-12-
22" }, "gender" : "man" }
{ "_id" : ObjectId("52cba4a25f43f6ce2ec9788c"), "age" : 0 }
{ "_id" : ObjectId("52cba4f35f43f6ce2ec9788d"), "name" : "jack", "age" : 201 }
>
看见了吧,大于201的都被改成了99了。


<四>:remove()操作,如果加了条件则删除一条记录,不加则删除全部。网上是这样子说的,且不可回退,尼玛也太恐怖了吧。
> db.person.remove({"name":"jack"})
> db.person.count({"name":"jack"})
0
> db.person.find({"name":"jack"})
> db.person.remove()
> db.person.find()
>

说真的,如果误操作了,真的很悲催。所以,一般都会禁止remove()操作的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值