简单的记录一下使用IDEA操作java连接Mongodb来查询附近人
1.创建一个java项目,使用springboot也可以
2.在项目下创建lib文件夹,并将Mongobd的jar包放入(这步具体操作可以百度,很简单)
3.引入jar包后就可以使用Mongodb的一些对象了
//连接Mongodb
MongoClient mongoClient = new MongoClient("这里写Mongodb的ip,端口不写的话默认是27017,例子:127.0.0.1:27017");
//连接你的数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("这里写你要数据库的名称");
//连接你的表/集合,没有则新创建一个
MongoCollection<Document> collection = mongoDBUtils.getMongo().getCollection("这里写你的表/集合");
4.之后你就可以使用获取的collection对象来进行操作数据库了,比如查询全部
//find()方法查询全部
FindIterable<Document> documents = collection.find();
//拿到所有的文档集合后使用迭代器
MongoCursor<Document> iterator = documents.iterator();
//循环出每一个文档
while (iterator.hasNext()) {
//测试效果,或操作得到的文档
System.out.println(iterator.next());
}
5.因为我要实现附近人的功能,要使用aggregate这个方法,在mongodb中写法是这样的
db.collection.aggregate({
$geoNear:{
near: [115.995593,28.681813], // 当前坐标
spherical: true, // 计算球面距离
distanceMultiplier: 6378137, // 地球半径,单位是米,那么的除的记录也是米
maxDistance: 2000/6378137, // 过滤条件2000米内,需要弧度
distanceField: "distance" // 距离字段别名
}
})
6.向数据库中写入一个或多个数据
//使用document对象,拼接好数据
Document document = new Document("name", "张三")
.append("address", "北京天安门左胡同2号")
.append("gender", (double)0)
.append("loc", Arrays.asList(116.000821,28.68129));//因为坐标字段要使用一个,要求数组,插入数组使用这种插入
//插入一个文档
collection.insertOne(document);
7.这个要在java里也进行实现
//首先创建一个集合,泛型是BasicDBObject
List<BasicDBObject> basicDBObjectList = new ArrayList<>();
//创建一个BasicDBObject对象,然后拼接数据,它也是key-value类型的,对应拼接就行
BasicDBObject basicDBObject = new BasicDBObject("$geoNear",
new BasicDBObject("near", new double[]{121.286671, 41.015798}).//当前用户坐标
append("spherical", true).//计算球面距离
append("distanceMultiplier", 6378137).//地球半径,单位是米,那么的除的记录也是米
append("maxDistance", (double) 2000000 / 6378137).//过滤条件2000米内,需要弧度,这里计算平局距离要加double,否则会查询全部数据
append("distanceField", "distance"));//距离字段别名
//然后将这个对象add到集合中
basicDBObjectList.add(basicDBObject);
//然后用上面获取的collection对象中的aggregate方法,参数就是这个集合
AggregateIterable<Document> inventory = collection.aggregate(basicDBObjectList);
//拿到这个集合后使用迭代器
MongoCursor<Document> iterator = inventory.iterator();//迭代器
//遍历
while (iterator.hasNext()) {
//获取单个文档
Document dnext = iterator.next();
//拿到单个文档然后get,因为我们上面设置了距离字段别名为distance,这里就获取它,查看你输入坐标附近2000m内的数据,当然,要先向数据库中存放数据,并设置2d索引后才能查询
double distance = (double) dnext.get("distance");
//打印距离
System.out.println("距离为:" + dnext);
}
(个人记录)