您的位置:首页 > 数据库 > Mongodb

学习记录之mongodb

2015-08-11 19:10 501 查看
<span style="font-family: Arial, Helvetica, sans-serif;">本文是一篇学习记录,其中较多文段来自于对其他文章章节的复制。我只是做我自己的总结记录,方便日后查看。</span>


引用的作者:http://www.cnblogs.com/lecaf/archive/2013/08/23/mongodb.html

一、安装mongodb

1,下载地址:http://www.mongodb.org/downloads

2.解压缩到自己想要安装的目录,比如d:\mongodb

3.创建文件夹d:\mongodb\data\db、d:\mongodb\data\log,分别用来安装db和日志文件,在log文件夹下创建一个文件MongoDB.log,即d:\mongodb\data\log\MongoDB.log

4.启动mongodb

运行cmd.exe进入dos命令界面,执行下列命令

  > cd d:\mongodb\bin

  > d:\mongodb\bin>mongod --dbpath "d:\mongodb\data\db"

5,每次使用mongodb都需要重复3和4步,比较麻烦。所以考虑将mongodb注册为windows服务

> d:\mongodb\bin>mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --install --serviceName "MongoDB"

 这里MongoDB.log就是开始建立的日志文件,--serviceName "MongoDB" 服务名为MongoDB
启动mongodb服务

> d:\mongodb\bin>NET START MongoDB

6.此时其实还是有一点点麻烦,因为每次使用mongodb都需要先cd 到它所在的文件夹 ,也就是d:\mongodb\bin。

我们可以将此路径添加到系统path里

桌面 计算机图标 右键-》属性-》高级系统设置-》环境变量 ,在系统变量里找到 Path,在它的末尾添加d:\mongodb\bin,然后一路确定就好。

这样就不必cd了,直接打开cmd然后敲击mongo就可以使用了。

二,mongodb的命令行操作
mongodb 文档:http://docs.mongodb.org/manual/reference/method/db.collection.findOne/

1.常用的命令

show dbs 显示数据库列表
use dbname 进入dbname数据库,大小写敏感,没有这个数据库则会自动创建
show collections 显示数据库中的集合,相当于表格
db.collectionsname.find()

接下来是经典的CRUD

2.创建&新增 create

db.users.save({"name":"lecaf"}) 创建了名为users的集合,并新增了一条{"name":"lecaf"}的数据
db.users.insert({"name":"ghost", "age":10}) 在users集合中插入一条新数据,,如果没有users这个集合,mongodb会自动创建
save()和insert()也存在着些许区别:若新增的数据主键已经存在,insert()会不做操作并提示错误,而save() 则更改原来的内容为新内容
比如若存在数据:{ _id : 1, " name " : " n1 "} ,_id是主键

insert({ _id : 1, " name " : " n2 " }) 会提示错误
save({ _id : 1, " name " : " n2 " }) 会把 n1 改为 n2 ,有update的作用。
但注意:只是主键,若修改其他键,两者都会新增

3.删除 delete

db.users.remove() 删除users集合下所有数据
db.users.remove({"name": "lecaf"}) 删除users集合下name=lecaf的数据
db.users.drop()或db.runCommand({"drop":"users"}) 删除集合users
db.runCommand({"dropDatabase": 1}) 删除当前数据库

4.查找 retrieve

遇到觉得奇怪的命令可以查看mongodb原文文档,本文末尾附网址。

db.users.find() Selects documents in a collection and returns
a cursor to
the selected documents.
db.users.findOne()
Returns one document that satisfies the specified query criteria. If multiple documents satisfy the query, this method returns the first document according to the natural
order which reflects the order of documents on the disk.

5.修改 update

db.users.update({"name":"lecaf"}, {"age":10}) 第一个参数是查找条件,第二个参数是修改内容。此处相当于 修改name=lecaf的数据为age=10,

注意:除了主键,其他内容会被第二个参数的内容替换

所以假如你的原数据是 {“_id":1,"name":"lecaf","age":3},那么你使用如上命令后数据会变成:{“_id":1,"age":10}!!!!所以请注意,它不是只update你给出的参数中包含的部分,而是将除了主键外的参数全部更换为你给出的第二个参数!!!所以若是不小心使用它,是很容易丢失数据的!

6,一些高级操作

1.条件查找

db.collectionsname.find({ "key" : value }) 查找key=value的数据
db.collectionsname.find({ "key" : { $gt: value } }) key > value
db.collectionsname.find({ "key" : { $lt: value } }) key < value
db.collectionsname.find({ "key" : { $gte: value } }) key >= value
db.collectionsname.find({ "key" : { $lte: value } }) key <= value
db.collectionsname.find({ "key" : { $gt: value1 , $lt: value2 } }) value1 < key <value2
db.collectionsname.find({ "key" : { $ne: value } }) key <> value
db.collectionsname.find({ "key" : { $mod : [ 10 , 1 ] } }) 取模运算,条件相当于key
% 10 == 1 即key除以10余数为1的
db.collectionsname.find({ "key" : { $nin: [ 1, 2, 3 ] } }) 不属于,条件相当于key的值不属于[
1, 2, 3 ]中任何一个
db.collectionsname.find({ "key" : { $in: [ 1, 2, 3 ] } }) 属于,条件相当于key等于[ 1, 2, 3 ]中任何一个
db.collectionsname.find({ "key" : { $size: 1 } }) $size 数量、尺寸,条件相当于key的值的数量是1(key必须是数组,一个值的情况不能算是数量为1的数组)
若key为一个值时,查询无返回值
db.collectionsname.find({ "key" : { $exists : true|false } }) $exists 字段存在,true返回存在字段key的数据,false返回不存在字度key的数据
db.collectionsname.find({ "key": /^val.*val$/i }) 正则,类似like;“i”忽略大小写,“m”支持多行
db.collectionsname.find({ $or : [{a : 1}, {b : 2} ] }) $or或 (注意:MongoDB
1.5.3后版本可用),符合条件a=1的或者符合条件b=2的数据都会查询出来
db.collectionsname.find({ "key": value , $or : [{ a : 1 } , { b : 2 }] })
符合条件key=value ,同时符合其他两个条件中任意一个的数据
db.collectionsname.find({ "key.subkey" :value }) 内嵌对象中的值匹配,注意:"key.subkey"必须加引号
db.collectionsname.find({ "key": { $not : /^val.*val$/i } }) 这是一个与其他查询条件组合使用的操作符,不会单独使用。上述查询条件得到的结果集加上$not之后就能获得相反的集合。

2.排序

db.collectionsname.find().sort({ "key1" : -1 ,"key2" : 1 }) 这里的1代表升序,-1代表降序

3.其他

db.collectionsname.find().limit(5) 控制返回结果数量,如果参数是0,则当作没有约束,limit()将不起作用
db.collectionsname.find().skip(5) 控制返回结果跳过多少数量,如果参数是0,则当作没有约束,skip()将不起作用,或者说跳过了0条
db.collectionsname.find().skip(5).limit(5) 可用来做分页,跳过5条数据再取5条数据
db.collectionsname.find().count(true) count()返回结果集的条数
db.collectionsname.find().skip(5).limit(5).count(true) 在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数

mongodb 文档:http://docs.mongodb.org/manual/reference/method/db.collection.findOne/

查官方文档获取第一手资料是掌握技术最可靠的方式!

三、java操作mongodb

官方文档:http://api.mongodb.org/java/current/

依赖包:mongo-java-driver.jar (依赖包都可以在我的资源页0积分下载到)

同样是做增删改查:

import java.net.UnknownHostException;
import java.util.HashMap;

import org.bson.BasicBSONObject;
import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;

public class MongoCRUDTest {
static MongoCollection<Document> mongoCollction;

public static void main(String[] args) {
MongoClient mongoClient = new MongoClient();
// display all dbs'name
Iterable<String> dbIterable = mongoClient.listDatabaseNames();
for (String s : dbIterable) {
System.out.println(s);
}
// get dababase,叫entries的数据库若不存在,则会被创建
MongoDatabase mongoDatabase = mongoClient.getDatabase("entries");
// display all collctions'name
Iterable<String> collctionIterable = mongoDatabase
.listCollectionNames();
for (String s : collctionIterable) {
System.out.println(s);
}
// get collection,叫Entry的集合若不存在,则会被创建
mongoCollction = mongoDatabase.getCollection("Entry");
// then,we begin the try of CRUD

create();

retrieve(); // 每进行一个操作,都retrieve(查看)一下效果

update();

retrieve(); // 每进行一个操作,都retrieve(查看)一下效果

delete();

retrieve(); // 每进行一个操作,都retrieve(查看)一下效果
}

public static void create() {
Document document = new Document();
document.put("age", 1);
mongoCollction.insertOne(document);
}

public static void retrieve() {
// retrieve:display all data
FindIterable<Document> findIterable = mongoCollction.find();
for (Document s : findIterable) {
System.out.println(s);
}
System.out.println("\n");
}

public static void update() {
// update,we need two document first
// one is filter,it is to find which will be update
// 在这里就是,age=1的内容都会被更新
Document filter = new Document();
filter.put("age", 1);
// the other is update,it is the result of update
// 他们更新后的结果是,age变成2
Document fieldsToSet = new Document();
fieldsToSet.put("age", 2);
// 这一句是在网上查到的,set
Document update = new Document("$set", fieldsToSet);
UpdateResult updateResult = mongoCollction.updateMany(filter, update);
// 此处若改为updateOne(),那么假如数据如下:
// {_id=1, age=1},{_id=2, age=1},{_id=3, age=1}
// 则会导致无法修改以上的数据,因为它只update one,面对多数据就会不做操作
// deleteOne和deleteMany也同样
}

public static void delete() {
Document filter = new Document("age", 2);
DeleteResult deleteResult = mongoCollction.deleteMany(filter);
}
}

四、morphia的增删改查

官方文档:http://mongodb.github.io/morphia/1.0/javadoc/

依赖包:morphia.jar和mongo-java-driver.jar (依赖包都可以在我的资源页0积分下载到)

import java.net.UnknownHostException;

import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.google.code.morphia.mapping.Mapper;
import com.google.code.morphia.query.Query;
import com.google.code.morphia.query.UpdateOperations;
import com.google.code.morphia.query.UpdateOpsImpl;
import com.mongodb.MongoClient;

public class test {
static Datastore datastore;
public static void main(String[] args){
Morphia morphia=new Morphia();
try {
MongoClient morphiaClient=new MongoClient();
datastore=morphia.createDatastore(morphiaClient,"entries");

create();
retrieve();

update();
retrieve();

delete();
retrieve();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void create() {
//Entry创建时名字是9.6 good day
Entry entry=new Entry("9.6 good day");
datastore.save(entry);
}

public static void retrieve() {
Iterable<Entry> entryIterable=datastore.find(Entry.class);
for(Entry s:entryIterable){
System.out.println(s);
}
System.out.println("\n");
}

public static void update() {
//改名为haha
Query<Entry> entryQuery=datastore.find(Entry.class);
UpdateOperations updateOperations=datastore.createUpdateOperations(Entry.class);
updateOperations.set("name", "haha");
datastore.update(entryQuery, updateOperations);
}

public static void delete() {
//删除Entry类对应的数据
Query<Entry> entryQuery=datastore.find(Entry.class);
datastore.delete(entryQuery);
}
}


多日之后,终于把这篇总结写完哈哈。加油

三和四都是看着原文文档一点点敲出的代码,算是一种尝试啦,干得漂亮。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: