设为首页 加入收藏

TOP

使用morphia对基于mongodb应用开发 (一)
2014-11-24 07:14:02 来源: 作者: 【 】 浏览:11
Tags:使用 morphia 基于 mongodb 应用开发
最近初学了下mongoDB,作为比较火的一个NoSQL数据库,确实比较强大,但是这几天学下来更多的感觉到的是学习、使用都很方便。

首先是初学者体验使用方便,直接 下载(http://www.mongodb.org/downloads)解压,然后启一下服务便可使用:mongod --dbpath your_db_data_dir,启动以后默认端口27017, 默认http端口28017,可以通过http://localhost: 28017 查看基本信息。当然,如果你还没有下载的想法,可以直接在其官网上尝试Try The Online Shell,就可以使用其来做各种操作,当然online的功能较少。

其次,一改关系 数据库的表模型,mongodb是一个以松散的集合形势呈现,这种no shema让我感觉非常方便。从开发人员的角度看,mongodb中的每一个数据对象就是一个JSON,所有的操作(save,update,find etc.)都可以像操作JSON一样,当然mongodb数据是一种叫做BSON格式的,即Binary JSON:http://bsonspec.org/ 。例如:

将文档{ name:”abc”,age:12}插入到users集合:

db.users.insert ({name:”abc”,age:12})

修改文档,增加其emails属性:

db.users.update(

{name:"abc"},

{"$set": {emails:["abc@gmail.com","abc@163.com"]}}

)

查找所有users文档:

db.users.find();

查找age > 20的前5个:

db.users.find({

age: {“$gt”:20}

}).limit(5)

删除:db.users.delete({name:”abc”})

这些基本的操作不一一例举,包括像index的操作,统计函数等,总之,一切都是文档:查询表达式是文档、返回数据是文档、修改数据的新值是文档、index的操作也是文档形式等等。另外,诸如其支持的MAPREDUCE操作,只需在其规范内定义自己的map和reduce函数即可完成简单MR计算;使用GridFS规范来存储大文件。

最后的方便之处就是对很多开发语言的支持, PHP, Java, Python, Ruby, Perl。这里我就使用Morphia来做一个非常简单demo: 假设一千个店铺(store)分布在不同的地方(place),每个地方都有一个二维的坐标(x,y)用来表示其位置,我们可以很方便的查找到诸如 离***地方最近的***店铺。整个例子分三步:

1) 准备数据

2) 测试数据是否准备好

3) 查找店铺

使用jars: mongo-2.7.0.jar, morphia-0.98.jar

下面是两个model类:



@Entity(value="stores",noClassnameStored=true)
public class Store {
@Id
private ObjectId id;
private String name;
private String desc;
@Embedded
public Place place;
@Override
public String toString() {
return "Store [desc=" + desc + ", id=" + id + ", name=" +
name + ", place=" + place + "]";
}

public Store(){}
public Store(String name, String desc, Place place) {
this.name = name;
this.desc = desc;
this.place = place;
}
//省略getter,setters
}

@Entity(value="stores",noClassnameStored=true)
public class Store {
@Id
private ObjectId id;
private String name;
private String desc;
@Embedded
public Place place;
@Override
public String toString() {
return "Store [desc=" + desc + ", id=" + id + ", name=" +
name + ", place=" + place + "]";
}

public Store(){}
public Store(String name, String desc, Place place) {
this.name = name;
this.desc = desc;
this.place = place;
}
//省略getter,setters
}




@Embedded
public class Place {

private String name = "";
@Indexed(IndexDirection.GEO2D)
private double[] loc = null;

public Place(String name, double[] loc) {
this.name = name;
this.loc = loc;
}

public Place() {
}

@Override
public String toString() {
return "Place [loc=" + Arrays.toString(loc) + ", name=" + name + "]";
}
//省略getter,setters
}

@Embedded
public class Place {

private String name = "";
@Indexed(IndexDirection.GEO2D)
private double[] loc = null;

public Place(String name, double[] loc) {
this.name = name
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇基于输出的数据库审计和三层数据.. 下一篇基于MongoDB GridFS的图片存储

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)