mongodb安装与基本查找操作:学习整理(一)

来源:互联网 发布:类似聚合数据的网站 编辑:程序博客网 时间:2024/05/17 21:55

**

windows下MongoDB的安装及配置:

**
安装参考文章:http://www.cnblogs.com/jiaxuekai/p/7204716.html
https://jingyan.baidu.com/article/ed15cb1b52b8661be2698162.html
http://www.weste.net/2014/10-31/99742.html
[MongoDB服务无法启动,windows提示发生服务特定错误:100]
(http://www.cnblogs.com/BGOnline/p/6813804.html:)
管理员账号密码设置:以及关于登陆报错设置http://blog.csdn.net/q1056843325/article/details/70941697

基本概念与操作:

_id和ObjectId
MongoDB 中存储的文档必有一”_id” 键。这个键的值可以是任何类型的,默认是个ObjectId 对象。在一个集合里面,每个文档都有唯一的”_id” 值,来确保集合里面每个文档都能被唯一标识。如果有两个集合的话,两个集合可以都有一个值为123 的”_id” 键,但是每个集合里面只能有一个”_id” 是123 的文档。
1. ObjectId
ObjectId 是”_id” 的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。这是MongoDB 采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值既费力还费时。MongoDB 从一开始就设计用来作为分布式数据库,处理多个节点是一个核心要求。后面会看到ObjectId 类型在分片环境中要容易生成得多。

ObjectId 使用12 字节的存储空间,每个字节两位十六进制数字,是一个24 位的字符串。由于看起来很长,不少人会觉得难以处理。但关键是要知道这个长长的ObjectId 是实际存储数据的两倍长。

如果快速连续创建多个ObjectId,会发现每次只有最后几位数字有变化。另外,中间的几位数字也会变化(要是在创建的过程中停顿几秒钟)。这是ObjectId 的创建方式导致的。12 字节按照如下方式生成:
这里写图片描述
接下来的3 字节是所在主机的唯一标识符。通常是机器主机名的散列值。这样就可以确保不同主机生成不同的ObjectId,不产生冲突。
为了确保在同一台机器上并发的多个进程产生的ObjectId 是唯一的,接下来的两字节来自产生ObjectId 的进程标识符(PID)。

前9 字节保证了同一秒钟不同机器不同进程产生的ObjectId 是唯一的。后3 字节就是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId 也是不一样的。同一秒钟最多允许每个进程拥有2563(16 777 216)个不同的ObjectId。
2. 自动生成_id
如果插入文档的时候没有”_id” 键,系统会自动帮你创建一个。可以由MongoDB 服务器来做这件事情,但通常会在客户端由驱动程序完成。理由如下。

虽然ObjectId 设计成轻量型的,易于生成,但是毕竟生成的时候还是产生开销。在客户端生成体现了MongoDB 的设计理念:能从服务器端转移到驱动程序来做的事,就尽量转移。这种理念背后的原因是,即便是像MongoDB 这样的可扩展数据库,扩展应用层也要比扩展数据库层容易得多。将事务交由客户端来处理,就减轻了数据库扩展的负担。

在客户端生成ObjectId,驱动程序能够提供更加丰富的API。例如,驱动程序可以有自己的insert 方法,可以返回生成的ObjectId,也可以直接将其插入文档。如果驱动程序允许服务器生成ObjectId,那么将需要单独的查询,以确定插入的文档中的”_id” 值。

**MongoDB语法与现有关系型数据库SQL语法比较 MongoDB语法 MySql语法**-------------------------------------------db.test.find({'name':'foobar'})<==> select * from test where name='foobar'db.test.find()                            <==> select *from testdb.test.find({'ID':10}).count()<==> select count(*) from test where ID=10db.test.find().skip(10).limit(20)<==> select * from test limit 10,20db.test.find({'ID':{$in:[25,35,45]}})<==> select * from test where ID in (25,35,45)db.test.find().sort({'ID':-1})  <==> select * from test order by IDdescdb.test.distinct('name',{'ID':{$lt:20}})  <==> select distinct(name) from testwhere ID<20db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}})  <==> select name,sum(marks) from testgroup by namedb.test.find('this.ID<20',{name:1})  <==> select name from test whereID<20db.test.insert({'name':'foobar','age':25})<==>insertinto test ('name','age') values('foobar',25)db.test.remove({})                        <==> delete * from testdb.test.remove({'age':20})            <==> delete test where age=20db.test.remove({'age':{$lt:20}})   <==> elete test where age<20db.test.remove({'age':{$lte:20}})  <==> delete test where age<=20db.test.remove({'age':{$gt:20}})  <==> delete test where age>20db.test.remove({'age':{$gte:20}})<==> delete test where age>=20db.test.remove({'age':{$ne:20}})  <==> delete test where age!=20db.test.update({'name':'foobar'},{$set:{'age':36}})<==> update test set age=36 where name='foobar'db.test.update({'name':'foobar'},{$inc:{'age':3}})<==> update test set age=age+3 where name='foobar'