我有集合db.problems。每个文档都包含嵌套的 area 和 category 对象。文档示例:
{
_id: 1,
text: 'Hello',
area: {_id: 23, title: 'Area 61'},
category: {_id: 12, title: 'Just a category'}
}
我试图按类别统计每个领域的问题并得到如下结果:
[
{
area: {_id: 2, title: 'Area 61'},
categoriesStats: {
12: {title: 'Just a category', problemCount: 123},
42: {title: 'Another category', problemCount: 11}
}
},
{...}
]
最主要的是categoriesStats必须是一个散列(以类别的id为键)
我目前想到的:
db.problems.aggregate([
{$group: {
_id: {areaId: '$area._id', categoryId: '$category._id'},
problemCount: {$sum: 1},
area: {$first: '$area'},
category: {$first: '$category'}
}},
{$group: {
_id: '$_id.areaId',
area: {$first: '$area'},
categoriesStats: {
$push: {
problemCount: '$problemCount',
category: '$category'
}
}
}},
{$project: {_id: 0, area: 1, categoriesStats: 1}}
])
查询结果:
{
"result": [
{
"area": {"_id": 37, "name": "Some area"},
"categoriesStats": [
{
"problemCount": 1,
"category": {"_id": 4, "title": "Just a cat"}
},
{
"problemCount": 1,
"category": {"_id": 3, "title": "Misc"}
}
]
},
{
"area": {"_id": 36, "name": "wow such area"},
"categoriesStats": [
{
"problemCount": 1,
"category": {"_id": 4, "title": "Just a cat"}
},
{
"problemCount": 2,
"category": {"_id": 3, "title": "Misc"}
}
]
}
],
"ok": 1
}
如您所见,我已经设法获得几乎需要的结果,但我无法将 categoriesStats 作为哈希值。
我在 $project 阶段试过查询,比如
{$project: {'$category._id': '$categories'},但是
"$expressions are not allowed at the top-level of $project"
我也试过像这样预定义查询:
(3 是某个类别的 _id)
{$group: ...},
{$project: {
'categoriesStats.3': {$cond: [{$eq: ['$category._id', 3]}, '$category', null]}},
//Same field for every category _id
{$group: ...}
但在这种情况下,我无法通过 $group 阶段获取此哈希
所以,问题是,有没有办法以 hashmap 形式获取 categoriesStats?
最佳答案
您可以使用游标方法修改聚合结果 forEach() 迭代游标并访问文档,如以下示例所示:
var cur = db.problems.aggregate([
{$group: {
_id: {areaId: '$area._id', categoryId: '$category._id'},
problemCount: {$sum: 1},
area: {$first: '$area'},
category: {$first: '$category'}
}},
{$group: {
_id: '$_id.areaId',
area: {$first: '$area'},
categoriesStats: {
$push: {
problemCount: '$problemCount',
category: '$category'
}
}
}},
{$project: {_id: 0, area: 1, categoriesStats: 1}}
]),
results = [];
cur.forEach(function (res){
var obj = {
"categoriesStats": {}
};
var category = {};
obj.area = res.area;
res.categoriesStats.forEach(function(c){
var cat = {};
cat["title"] = c.category.title;
cat["problemCount"] = c.problemCount;
obj["categoriesStats"][c.category._id.toString()] = cat;
});
results.push(obj);
});
查看下面的演示
var cur = {
"result": [
{
"area": {"_id": 37, "name": "Some area"},
"categoriesStats": [
{
"problemCount": 1,
"category": {"_id": 4, "title": "Just a cat"}
},
{
"problemCount": 1,
"category": {"_id": 3, "title": "Misc"}
}
]
},
{
"area": {"_id": 36, "name": "wow such area"},
"categoriesStats": [
{
"problemCount": 1,
"category": {"_id": 4, "title": "Just a cat"}
},
{
"problemCount": 2,
"category": {"_id": 3, "title": "Misc"}
}
]
}
],
"ok": 1
};
var results = [];
cur.result.forEach(function (doc){
var obj = {
"categoriesStats": {}
};
var category = {};
obj.area = doc.area;
doc.categoriesStats.forEach(function(c){
var cat = {};
cat["title"] = c.category.title;
cat["problemCount"] = c.problemCount;
obj["categoriesStats"][c.category._id.toString()] = cat;
});
results.push(obj);
});
pre.innerHTML = JSON.stringify(results);<pre id="pre"></pre>
关于mongodb - 蒙戈 : get hashmap in aggregate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30787139/
我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多
我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序
我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")
我正在尝试使用聚合框架(使用ruby)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u
我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结
文章目录Elasticsearch和MongoDB对比关于ElasticsearchElasticsearch应用场景关于MongoDBMongoDB优点mongodb适用场景Elasticsearch和MongoDB对比Elasticsearch和MongoDB开源许可协议参考Elasticsearch和MongoDB对比关于Elasticsearch官网:https://www.elastic.co/cn/elasticsearch/Elasticistheleadingplatformforsearch-poweredsolutions.Weaccelerateresultsthatma
db.col.insertMany([{"_id":"tt0084726","title":"StarTrekII:TheWrathofKhan","year":1982,"type":"movie"},{"_id":"tt0796366","title":"StarTrek","year":2009,"type":"movie"},{"_id":"tt0084726","title":"StarTrekII:TheWrathofKhan","year":1982,"type":"movie"}]);OS:LinuxMint17.3RosaMongoDB:dbversionv2.6.1
我在使用mongodb在服务器端存储图像的客户端访问http请求时遇到了问题。我非常感谢帮助。我需要一个简单的示例来说明如何将图像文件作为数据添加到httppost请求(例如XMLhttprequest)中。比方说,我知道服务器方法的网址。图片来源定义在imgsrc文件名存放在name我有这个自动取款机:varhttp=newXMLHttpRequest();httpPost.onreadystatechange=function(err){if(httpPost.readyState==4&&httpPost.status==200){console.log(httpPost.res
目录MongoDB简介安装MongoDB 安装MongoDBShell添加账户密码 安装MongoDBCompassMongoDB简介MongoDB是一个流行的开源文档型NoSQL数据库管理系统,使用C++语言编写。与传统的关系型数据库不同,MongoDB使用文档模型来存储数据。文档模型是一种灵活的数据模型,它允许您在单个文档中存储和查询相关数据。文档模型还支持嵌套文档和数组结构,这使得它非常适合处理复杂的数据结构。MongoDB的特点包括:非常灵活的文档模型,可以轻松存储复杂数据类型。分布式系统设计,可以通过分片技术实现横向扩展,适合大规模数据处理。支持丰富的查询语言和聚合框架,使得开发人
minioappVersion:2022-06-25chartVersion:11.7.7一、独立模式auth:auth:rootPassword:"12345678rtt"#密码长度需>=8位rootUser:"root"mode:standalone#默认为单机模式persistence:storageClass:minio-data#存储类,必填size:8Giservice:type:NodePort#暴露端口port:9000nodePort:31311二、分布式模式auth:auth:rootPassword:"12345678rtt"#密码长度需>=8位rootUser:"roo