如何在 Mongoose/Mongodb 中创建查询以获取此 json
How to create a query in Mongoose/Mongodb to obtain this json?
>我正在尝试从我的mongodb获取这样的对象,每月计算操作系统:
{January: {Android: 30, iOS: 10, winPhone: 5}, February: {Android: 4, iOS: 40}, etc}.
这是我的猫鼬模式:
var MySchema = new Schema({
date: {type: Date, default: Date.now},
os: String
});
可以给我一个想法吗?有没有办法创建单个查询来返回整个对象,或者我应该逐个构建它,统一多个查询?
谢谢!
对于MongoDB来说,最好使用更自然的输出结构,其中键是静态的,值包含数据。 然后,可以使用聚合管道执行以下操作:
MyModel.aggregate([
// Group the docs by month & os
{$group: {_id: {month: {$month: '$date'}, os: '$os'}, count: {$sum: 1}}},
// Group again by just month
{$group: {_id: '$_id.month', counts: {$push: {os: '$_id.os', count: '$count'}}}},
// Rename _id to month
{$project: {month: '$_id', counts: 1, _id: 0}}
], callback);
生成如下输出:
{
"result" : [
{
"counts" : [
{
"os" : "winPhone",
"count" : 2
},
{
"os" : "iOS",
"count" : 1
},
{
"os" : "Android",
"count" : 2
}
],
"month" : 1
},
{
"counts" : [
{
"os" : "iOS",
"count" : 2
},
{
"os" : "Android",
"count" : 1
}
],
"month" : 2
}
],
"ok" : 1
}
如果您真的想要原始格式,则可以对结果进行后处理以根据需要对其进行重塑。
由于要将值投影为输出中的键,因此无法使用聚合管道实现此目的。没有一个管道运算符接受值作为键。你需要编写mapreduce函数。根据年份对记录进行分组的map
函数。因此,year
emitted
为关键。该值是每个os
的名称和出售它的"月份"。
map
功能:
var map = function(){
emit(this.date.getFullYear(),
{"month":this.date.getMonth(),"os":this.os});
}
现在,每个组的reduce
功能汇总了该年一个月内售出的不同types
os
的count
。
var reduce = function(id,osArr){
var result = {};
var osCount = {};
var monthNames = [ "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December" ];
for(var i=0;i<osArr.length;i++)
{
var mon = monthNames[(osArr[i].month)-1];
if(!osCount.hasOwnProperty(mon))
{
osCount[mon] = {};
}
if(osCount[mon].hasOwnProperty(osArr[i].os))
{
osCount[mon][osArr[i].os]++;
}
else
{
osCount[mon][osArr[i].os] = 1;
}
}
result[id] = osCount;
return result;
}
调用集合上的 map reduce 函数,并将其转储到名为"temp"的新集合。
var o = {};
o.map = map;
o.reduce = reduce;
o.out = { replace: 'temp' }
o.verbose = true;
ModelName.mapReduce(o, function (err, results) {
console.log(results)
})
这将产生以下示例结果:
> db.temp.find({},{"value":1,"_id":0})
{ "value" : { "2013" : { "November" : { "Android" : 2, "ios" : 2, "blackberry" :
1 } } } }
{ "value" : { "2014" : { "October" : { "Android" : 3, "ios" : 2 } } } }
相关文章:
- AngularJS:获取链接中没有哈希的查询字符串值
- Solr查询以按日期月份获取数据&年
- 如何将mysql查询的结果获取到html文本框中
- Jquery - 从查询字符串中获取“#”值之后,而不是在“?”符号值之后获取
- 索引未在 $http.post 查询中获取正确的值
- JavaScript:从具有使用 # 符号的路由的 URL 获取查询字符串
- Express”;无法获取/查询“;错误
- 获取重复Get变量的查询字符串值
- *简单*解析云代码查询失败”;TypeError:无法调用方法'获取'未定义的“检索该信息”;
- 从查询字符串中获取变量,将其与Javascript中的数组匹配
- 如何使用html5中的javascript在页面加载时从查询字符串中获取值
- 仅从 ajax 查询获取 JSON
- 使用查询获取修改后的 dom 内容
- j查询获取所选复选框的索引
- parse.com 将数据从查询获取到成功函数之外的变量中
- 使用 jsonpath 查询获取父对象
- 从数组查询获取对象 JSON 值时出错
- j查询获取以前的输入值
- 需要使用CSOM和CAML查询获取lookplist值的帮助
- Angularjs:为什么服务查询获取的数据被当作对象对待,而不会被Angular使用?