Mongo 应用查询
官网操作手册,基本就够用
https://docs.mongodb.com/manual/
下面是个分组查询的例子,项目中用到然后查了个例子,自己理解了下,觉得很好很强大。
https://blog.csdn.net/yown/article/details/53946781
Mongo分组查询,分组查询,collection为要查询的集合,keyf为定义的聚合key或者有返回值的函数,query为查询条件,initial为各个字段的初始化方法,reduce为计算迭代的函数,finalz为完成查询后的打扫方法,一般删除集合之类的,利用脚本语言,可以实现多种聚合方式的查询
GroupCommand cmd = new GroupCommand(collection, keyf, query, initial, reduce, finalz);
Command:
db.runCommand({group:
{
ns:"collection1",
cond : { "$and":[{"gmtCreate":{"$gt":new ISODate("2016-10-01T00:00:00.000Z")}}, {"gmtCreate":{"$lt":new ISODate("2018-12-31T23:59:59.999Z")}}]},
$keyf:function(doc){
var myDate = new Date(doc.gmtCreate);
var mm = '0'+(myDate.getMonth()+1);
var dd = '0'+myDate.getDate();
return {day:myDate.getFullYear()+''+mm.substring(mm.length-2)+''+dd.substring(dd.length-2)};
},
initial:{"shareCount" : 0 , "shareUserCount" : 0 , "userIdMap" : {}},
$reduce:function(doc, prev){
if(doc.userId != null){
prev.shareCount ++;
if(prev.userIdMap[doc.userId] == null) {
prev.shareUserCount ++;
prev.userIdMap[doc.userId] = 1;
}
}
},
finalize: function(doc){ delete doc.userIdMap; }
}
});
JAVA方式:
public BasicDBList testGroupMongo(String dbName, String collectionName, BasicDBObject condition,
List<String> fields)
throws MongoDAOException {
DB db = mongoClient.getDB(dbName);
DBCollection collection = db.getCollection(collectionName);
String keyf = "function(doc){" + "var myDate = new Date(doc.gmtCreate);"
+ " var mm = '0'+(myDate.getMonth()+1); " + " var dd = '0'+myDate.getDate();"
+ " return {day:myDate.getFullYear()+'@'+mm.substring(mm.length-2)+'@'+dd.substring(dd.length-2)};"
+ "}";
BasicDBObject query = new BasicDBObject(); // where条件
BasicDBObject query1 = new BasicDBObject(); Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
//距离现在9个月之前
calendar.add(Calendar.MONTH, -9);
Date start = calendar.getTime(); query1.append("$gte", start);
query1.append("$lte", new Date());
query.append("gmtCreate", query1);
String reduce = "function(doc, prev){ " + "if(doc.userId != null){ " + " prev.shareCount++; "
+ " if(isNaN(prev.userIdMap[doc.userId])) { " + " prev.shareUserCount ++;"
+ " prev.userIdMap[doc.userId] = 1;" + " }" + "}" + "}";
String finalz = "function(prev){delete prev.userIdMap}";
BasicDBObject initial = new BasicDBObject();
initial.append("shareCount", 0);
initial.append("shareUserCount", 0);
initial.append("userIdMap", new HashMap<String, Integer>());
GroupCommand cmd = new GroupCommand(collection, keyf, query, initial, reduce, finalz);
BasicDBList group = (BasicDBList) collection.group(cmd);
return group;
}
命令执行例子
{
"retval" : [
{
"day" : "20171023",
"shareCount" : 2,
"shareUserCount" : 1
},
{
"day" : "20181023",
"shareCount" : 1,
"shareUserCount" : 1
},
{
"day" : "20180223",
"shareCount" : 1,
"shareUserCount" : 1
}
],
"count" : NumberLong(4),
"keys" : NumberLong(3),
"ok" : 1
}
aggregate:
db.collection1.find({"orderId":333,"address": { $in: ["shanghai", "beijing"] }}).limit(3).skip(0)
db.getCollection('collection1').aggregate(
[
{ $group :{
_id : "$orderId", address: { $push: "$address" } }
}, { $match : {"orderId": 333} },{ $limit : 1 }
],{ allowDiskUse: true }
)
db.getCollection('collection1').aggregate(
[
{
$group : {
_id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageQuantity: { $avg: "$quantity" },
count: { $sum: 1 }
}
}
]
)
db.getCollection('collection1').aggregate(
[
{ $group : { _id : "$item", books: { $push: "$price" } } },{ $limit : 3 }, {$match : {"_id": "xyz"}},
{ $project : { _id:1, books : 1 } } //结果中包含某些列
]
)
觉得这个也挺好用的

Mongo 应用查询的更多相关文章
- Mongo简单查询总结
mongo 简单查询db.ansheng.findOne()//返回第一条匹配到的数据db.ansheng.findOne({"aaaaa":4})db.ansheng.find( ...
- 监控Mongo慢查询
监控Mongo慢查询 1. 使用mongostat监控MongoDB全局情况 mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取MongoDB的当前运行状态,并输 ...
- Mongo常用查询语法
一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...
- mongo 慢查询配置
我是分片部署,所以慢查询相关的配置是在启动片服务上. 执行查询命令,是在share的primary 上. 1. mongodb慢查询 配置 慢查询数据主要存储在 local库的system.pro ...
- mongo 数据查询
基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty():将结果格式 ...
- mongo数据查询操作
本文来源于 :Stephen Liu 1. 基本查询: 构造查询数据. > db.test.findOne() { "_id" : Ob ...
- mongo数据库查询结果不包括_id字段方法
db.GPRS_PRODUCT_HIS_FEE.find({"条件字段" : "412171211145135"},{_id:0}) db.GPRS_PRODU ...
- mongo常用查询
复杂查询: and: or: lte,gte,=: and+lt: , 逗号表示and, $lt小于写在值当中 查询实例: 找到含有指定数据文档 查找条件spcode有1个字符长度的文档 db.sp ...
- mongo 过滤查询条件后分组、排序
描述:最近业主有这么一个需求,根据集合中 时间段进行过滤,过滤的时间时间段为日期类型字符串,需要根据某一日期进行截取后.进行分组,排序 概述题目:根据createTime时间段做查询,然后以 天进行分 ...
随机推荐
- arcgis for android 读取shp文件中文乱码解决方法
设置注册表默认字符,即可解决中文乱码问题. 'dbfDefault' 设置方法1.开始--运行,输入”Regedit“,打开注册表.2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ...
- 结对编程——paperOne基于java的四则运算 功能改进
项目成员:张金生 张政 由于新的需求,原本使用JSP的实现方式目前改为Java实现,即去除了B/S端. 需求分析: 1.四则运算要满足整数运算.分数运算两种: 2.运算题目随机,并且可以打印题 ...
- Java中的Html解析:使用jsoup
包:jsoup-1.10.2.jar import java.io.File; import java.io.IOException; import org.jsoup.Jsoup; import o ...
- for循环循环时间
)) { Console.WriteLine(dt); } ("2011-5-5") 按需求定义 AddDays函数, 一天一天的增长
- linux:ubuntu安装mysql(一)
1.下载MySQL安装包(MySQL Community Server) 地址:https://dev.mysql.com/downloads/mysql/ 2.解压 tar -xvf mysql-s ...
- JVM总结-虚拟机怎么执行字节码
1. JRE,JDK JRE : 包含运行 Java 程序的必需组件,Java 虚拟机+ Java 核心类库等. JDK : JRE + 一系列开发.诊断工具. 2. java字节码 编译器将 Ja ...
- jQuery插件——下拉选择框
其实,之前也写过jQuery插件,今天写的是一个模拟select选择的下拉插件. 既然是jQuery插件,那么必然是依赖jQuery的了. 老规矩,直接上代码吧! ;(function () { $. ...
- UiAutomatorHelper 调试类
package rom; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; impo ...
- [Unity插件]Lua行为树(五):装饰节点Repeater
Repeater:重复执行子节点,直到一定次数 特点如下: 1.执行次数可以是无限循环,也可以是固定次数 2.一般来说,子节点的执行返回状态不会影响Repeater节点,但可以设置当子节点返回失败时, ...
- 1、eclipse
1.安装java 32位 jdk-7u79-windows-i586-20151024.rar http://www.oracle.com/technetwork/java/javase/downlo ...