一.基础
1.添加
Givegift givegift=new Givegift();
givegift.setUserId(userId);
givegift.setTime(DateUtil.currentTimeSeconds());
dsForRW.save(givegift);
2.根据id删除一条数据 id一定要是object类型
Query<Gift> q=dsForRW.createQuery(Gift.class);
q.filter("giftId", new ObjectId(giftId));
dsForRW.delete(q);
3.修改记录 传入的giftId一定要修改为object类型的
Query<Gift> q = dsForRW.createQuery(Gift.class).field("_id").equal(new ObjectId(giftId));
UpdateOperations<Gift> ops = dsForRW.createUpdateOperations(Gift.class);
ops.set("name", name);
ops.inc("price",1000);//在原来价格的基础上增加1000元
ops.inc("price",-1000);//在原来价格的基础上减少1000元
Gift gift = dsForRW.findAndModify(q, ops);//这个是返回修改完成的 dsForRW.update(query, ops); 这个是没有返回值的
4.根据id查询一条数据
Query<User> q=dsForRW.createQuery(User.class);
q.filter("userId",userId);
User user=new User();
user=q.get();
query.field("key字段值").notEqual(条件); //notEqualb不等于
query.field("key字段值").greaterThanOrEq(条件); //greaterThanOrEq 大于等于
query.field("key字段值").lessThanOrEq(条件); //lessThanOrEq 小于等于
q.field("key字段值").contains(条件); //contains 包含
5.查询记录个数
Query<Hotel> query = ds.createQuery(Hotel.class);
return (int) query.countAll();
// 条件q
DBObject q = new BasicDBObject();
q.put("onlinestate", 1);
long count = dsForRW.getCollection(User.class).getCount(q);
.find(q).count() 也行
6.查询列表
Query<Hotel> query = ds.createQuery(Hotel.class);
query.field("hotelName").equal("如家酒店"); // 此处是精确查询
query.field("hotelName").contains("如家"); // 此处是模糊查询,酒店名称包含'如家'
query.field("price").greaterThan(100); // 查询价格大于100的酒店
query.field("price").lessThan(500); // 查询价格小于500的酒店
//and
query.and(query.criteria("hotelName").contains("如家"),
query.criteria("hotelAddress").contains("建设"));
//or
query.or(query.criteria("hotelName").contains("如家"),
query.criteria("hotelName").contains("汉庭"));
// 按价格正序排列 或者 按时间倒序排序(前面加一个'-')
query.order("price");
query.order("-creatTime");
// 分页相关,如果没有offset和limit,则一次性取出所有结果
query.offset(0); // 先得到查询结果集,然后从第0个开始取数据
query.limit(10); // 先得到查询结果集,一次最多从结果集中获取10个结果
return query.asList();
7.多个条件or的实现方法
方式1:
// 条件q
DBObject q = new BasicDBObject();
BasicDBList qList = new BasicDBList(); //BasicDBList和"$in"作为BasicDBObject参数使用,有点类似or
q.put("onlinestate", 1);
qList.add((new BasicDBObject("likes", new BasicDBObject("$gt", 100))));
qList.add((new BasicDBObject("likes", new BasicDBObject("$lt", 500))));
q.put("$or", qList); //多个条件or的实现方法,
方式2:
query.or(query.criteria("fromUserAccountID").equal(userId), query.criteria("fromUserAccountID").equal(toUserId));
8.正则匹配条件
//除去本人删除的消息
Pattern compile = Pattern.compile("^((?!" + userId + ").)*$", Pattern.CASE_INSENSITIVE);
query.field("delPerson").equal(compile);
9.指定返回字段 通过findone
DBObject q = new BasicDBObject();
q.put("from",from);
q.put("isReceived",0);
q.put("to",to);
DBObject q2 = new BasicDBObject();
q2.put("_id",true);
q2.put("from",true);
q2.put("to",true);
q2.put("ts",true);
q2.put("contentType",true);
q2.put("content",true);
q2.put("isRonceal",true);
return dsForNetty.getDB().getCollection("messageHistory").findOne(q,q2,new BasicDBObject("ts", -1));
10.分页
morphia框架:
dsForNetty.getCollection(GroupNoticeMessageHistory.class).find(q).sort(new BasicDBObject("time", 1))
.skip(pageIndex * pageSize).limit(pageSize).toArray();
原生:
dsForRW.createQuery(SingleChatMessage.class).order("-createdAt").offset(pageIndex * pageSize).limit(pageSize).asList();
二. 不通过实体类的aduc
1.post请求 转换为map集合添加
Map<String, String[]> parameterMap = request.getParameterMap();
BasicDBObject dbObj=new BasicDBObject();
for (Entry<String,String[]> entry : parameterMap.entrySet()) {
dbObj.put(entry.getKey(), entry.getValue()[0]);
}
userManager.getDatastore().getDB().getCollection("message").insert(new BasicDBObject(dbObj));
2.删除 id为object类型
BasicDBObject query=new BasicDBObject("_id", new ObjectId(id));
userManager.getDatastore().getDB().getCollection("message").remove(query);
3.修改
Map<String, String[]> parameterMap = request.getParameterMap();
BasicDBObject dbObj=new BasicDBObject();
for (Entry<String,String[]> entry : parameterMap.entrySet()) {
dbObj.put(entry.getKey(), entry.getValue()[0]);
}
BasicDBObject query=new BasicDBObject("_id", parse(dbObj.getString("_id")));
dbObj.remove("_id");
userManager.getDatastore().getDB().getCollection("message").update(query, new BasicDBObject(MongoOperator.SET, dbObj),true,false);
4.查询 和 按照条件查询
DBCollection db=dsForRW.getDB().getCollection("message");
BasicDBObject query=null;
if(!StringUtil.isEmpty(keyword)){
query=new BasicDBObject();
BasicDBList values = new BasicDBList();
values.add(new BasicDBObject("type", new BasicDBObject(MongoOperator.REGEX, keyword)));
values.add(new BasicDBObject("code", new BasicDBObject(MongoOperator.REGEX, keyword)));
query.put("$or", values);
}
List<DBObject> list =null;
long total=0;
if(null==query){
list= db.find().skip(pageIndex*pageSize).limit(pageSize).sort(new BasicDBObject("_id",-1)).toArray();
total=db.count();
}else{
list=db.find(query).skip(pageIndex*pageSize).limit(pageSize).sort(new BasicDBObject("_id",-1)).toArray();
total=db.count(query);
}
mav.addObject("page", new PageVO(list, total, pageIndex, pageSize));
$gt: >
$gte:>=
$eq: =
$ne: !=
$lt: <
$lte: <=
$in: in(后面的值为bson对象数组)
$nin: not in(后面的值为bson对象数组)
三.高级:
1.分组(过滤字段)
手动引用
import static org.mongodb.morphia.aggregation.Group.first;
import static org.mongodb.morphia.aggregation.Group.grouping;
import static org.mongodb.morphia.aggregation.Group.id;
AggregationPipeline friendsToUserId = dsForRW.createAggregation(Friends.class).match(query)
.group(id(grouping("toUserId")), grouping("toUserId", first("toUserId")));
// 指定聚合的输出格式为CURSOR
AggregationOptions aggregationOptions = AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build();
return Lists.newArrayList(friendsToUserId.aggregate("friends", FriendsToUserId.class, aggregationOptions, dsForRW.getCollection(Friends.class).getReadPreference()));
FriendsToUserId.class是新建的类
public class FriendsToUserId {
private String toUserId;
public String getToUserId() {
return toUserId;
}
public void setToUserId(String toUserId) {
this.toUserId = toUserId;
}
}
最终返回List<FriendsToUserId>的id
2.MongoDB批量修改
DBObject command = new BasicDBObject();
command.put("update", "messageHistory");
List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();
for (String i : id) {
BasicDBObject jo = new BasicDBObject();
jo.put("_id",new ObjectId(i));
BasicDBObject isReads = new BasicDBObject();
isReads.put("isRead", isRead);
BasicDBObject jo2 = new BasicDBObject();
jo2.put("$set", isReads);
BasicDBObject update = new BasicDBObject();
update.put("q", jo);
update.put("u", jo2);
update.put("upsert", true);
update.put("multi", true);
updateList.add(update);
}
command.put("updates", updateList);
command.put("ordered", true);
CommandResult commandResult = dsForNetty.getDB().command(command);
//两种批量修改用法,经多次测试方法1在执行效率上高于方法2。使用的时候两种有差异,但是皆可使用
//1、使用自己封装的MongoUpdateUtil工具类
//要修改的用户Id数组
int[] userIds = {10000004,10000005,10000006,10000007,10000008};
//批量修改集
List<UpdateOptions> list = new ArrayList<UpdateOptions>();
for (int i = 0; i < userIds.length; i++) {
//条件
BasicDBObject queryDBObject = new BasicDBObject();
queryDBObject.put("_id", userIds[i]);
//修改的内容
BasicDBObject updateDBObject = new BasicDBObject();
updateDBObject.put("name", "dawn");
//执行的操作
BasicDBObject setDBObject = new BasicDBObject();
setDBObject.put("$set", updateDBObject);
//包装修改对象
UpdateOptions updateOptions = new UpdateOptions();
updateOptions.setQuery(queryDBObject);
updateOptions.setUpdate(setDBObject);
updateOptions.setUpsert(false);
updateOptions.setMulti(true);
list.add(updateOptions);
}
long startTime = System.currentTimeMillis();
//执行批量修改
MongoUpdateUtil.update(dsForRW.getCollection(User.class), "user", list, true);
//2、使用MongoDB自带批量修改工具类
//条件
/*BasicDBObject queryDBObject = new BasicDBObject();
queryDBObject.put("name", "dawn");
//修改的内容
BasicDBObject updateDBObject = new BasicDBObject();
updateDBObject.put("name", "Dawn");
//执行的操作
BasicDBObject setDBObject = new BasicDBObject();
setDBObject.put("$set", updateDBObject);
//执行批量修改
dsForRW.getCollection(User.class).update(queryDBObject, setDBObject, true, true);*/
long endTime = System.currentTimeMillis();
System.err.println(endTime-startTime);
四.MongoDB数据库基本操作
1 .添加一个字段. url 代表表名 , 添加字段 content。 字符串类型。
db.collection.update({}, {$set: {content:""}}, {multi: 1})
2 .删除一个字段
db.collection.update({},{$unset:{'content':''}},false, true)
3.查询总数
db.collection.find().count()
4.修改
db.collection.update(
{"key字段值" : 条件},
{ $set: { "key字段值" : 要修改的值} },
false,
true
)
5.删除文档
db.collection.remove()
6.删除重复数据
db.collection.aggregate([
{
$group: { _id: {company: '$company',username: '$username'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
},
{
$match: {count: {$gt: 1}}
}
]).forEach(function(doc){
doc.dups.shift();
db.user2.remove({_id: {$in: doc.dups}});
})
7.MongoDB添加索引
索引:
db.collection.ensureIndex({"name":1})
联合索引:
db.collection.ensureIndex({"code":1,"type":1})
8.导入 导出 备份
导入:
mongoimport --host localhost --port 27017 --username user --password 123456 --collection host_locations_test --db ezsonar_25 --file /root/mgdbsql/user.json
参数重点说明:
– host 后的 localhost:要导入的数据库 ip
–port 后的 27017:要导入的实例节点端口号
–username 后的 user:数据库用户名
–password 后的 123456:数据库用户密码
–collection 后的 host_locations_test:要导入的表名
–db 后的 ezsonar_25:要导入的表所在数据库名
–file 后的 /root/mgdbsql/user.json:要导入的源文件路径(默认为当前文件夹)
导出:
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名
参数重点说明:
-f 导出指定字段,以逗号分割,-f uid,name,age导出uid,name,age这三个字段
-q 可以根据查询条件导出,-q ‘{ “uid” : “100” }’ 导出uid为100的数据
–csv 表示导出的文件格式为csv的。这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点
导出整个集合:
mongoexport -h dbhost -d dbname -c collectionname -f collectionKey -o dbdirectory
参数重点说明:
-h: MongoDB所在服务器地址
-d: 需要恢复的数据库实例
-c: 需要恢复的集合
-f: 需要导出的字段(省略为所有字段)
-o: 表示导出的文件名
比如要备份 OTT_DB数据库实例里面trsdata1集合到csv文件里面
mongoexport -h 127.0.0.1:27017 -d OTT_DB -c trsdata1 -o E:\data\dump\trsdata.csv 也可以导出json,txt等格式
备份:
mongodump -h dbhost -d dbname -o dbdirectory
参数重点说明:
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。