假设我有一个名为"posts"的集合(实际上它是一个更复杂的集合,帖子太简单了),具有以下结构:
> db.posts.find()
{ "_id" : ObjectId("50ad8d451d41c8fc58000003"), "title" : "Lorem ipsum", "author" :
"John Doe", "content" : "This is the content", "tags" : [ "SOME", "RANDOM", "TAGS" ] }
Run Code Online (Sandbox Code Playgroud)
我希望这个集合能够跨越数十万甚至数百万,我需要按标签查询帖子并按标签对结果进行分组并显示分页结果.这就是聚合框架的用武之地.我计划使用aggregate()方法来查询集合:
db.posts.aggregate([
{ "$unwind" : "$tags" },
{ "$group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
]);
Run Code Online (Sandbox Code Playgroud)
问题是要创建分页符,我需要知道输出数组的长度.我知道要做到这一点你可以这样做:
db.posts.aggregate([
{ "$unwind" : "$tags" },
{ "$group" : {
_id: { tag: "$tags" },
count: { $sum: 1 }
} }
{ "$group" : { …Run Code Online (Sandbox Code Playgroud) 我想查询如下,但这只包含一个$cond.
如何用两个查询$cond?
collection.aggregate(
{
$match : {
'_id' : {$in:ids}
}
},
{
$group: {
_id: '$someField',
...
count: {$sum: { $cond: [ { $eq: [ "$otherField", false] } , 1, 0 ] }}
}
},
function(err, result){
...
}
);
Run Code Online (Sandbox Code Playgroud) 我有一个名为Document in MongoDB的集合.此集合中的文档具有以ISO日期类型存储的名为CreationDate的字段.我的任务是计算每天创建的文档数量,并按异步数量排序.输出格式必须是[{_id:'yyyy-MM-dd',cnt:x}].我尝试使用如下聚合框架.
db.Document.aggregate(
, {$project: {_id:1, Year:{$year:'$CreationDate'}, Month:{$month:'$CreationDate'}, Date:{$dayOfMonth:'$CreationDate'}}}
, {$group: {_id:{$concat:['$Year', '-', '$Month', '-', '$Date']}, cnt:{$sum:1}}}
, {$sort:{'cnt':-1}}
);
Run Code Online (Sandbox Code Playgroud)
代码给出了如下错误:
$concat only supports strings, not NumberInt32
Run Code Online (Sandbox Code Playgroud)
我明白这是因为$ year,$ month和$ dayOfMonth都返回了数字.可以将_id字段组合为对象,并在应用程序级别以所需格式重新格式化它.
但从技术角度来看,我有两个问题:
如何在MongoDB shell中将数字转换为字符串?在这种情况下,$ year的输出可以转换为字符串并在$ concat中使用.
有没有更好的方法将ISODate输出格式化为各种日期格式?在许多情况下,我们只需要ISODate的某些部分,例如:日期组件或时间部分.是否有任何MongoDb内置运营商来实现这一目标?
提前感谢任何建议.
是否有一个我可以在聚合函数中使用的运算符来获取字符串而不是ObjectId作为响应?
db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}])
Run Code Online (Sandbox Code Playgroud) 我一直在寻找一段时间,似乎无法对内部数组进行排序,并将其保留在我正在使用的文档中.
{
"service": {
"apps": {
"updates": [
{
"n" : 1
"date": ISODate("2012-03-10T16:15:00Z")
},
{
"n" : 2
"date": ISODate("2012-01-10T16:15:00Z")
},
{
"n" : 5
"date": ISODate("2012-07-10T16:15:00Z")
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想保持项目作为服务返回,但我的更新数组已排序.到目前为止,我有shell:
db.servers.aggregate(
{$unwind:'$service'},
{$project:{'service.apps':1}},
{$unwind:'$service.apps'},
{$project: {'service.apps.updates':1}},
{$sort:{'service.apps.updates.date':1}});
Run Code Online (Sandbox Code Playgroud)
有人认为他们可以提供帮助吗?
我正在尝试使用聚合框架$match和$group阶段.$group阶段是否使用索引数据?我正在使用最新的mongodb版本 - 2.5.4
我正在尝试获取关键字计数parentId,categioryId和llcId.我的数据库是
{
"_id" : ObjectId("5673f5b1e4b0822f6f0a5b89"),
"keyword" : "electronic content management system",
"llcId" : "CL1K9B",
"categoryId" : "CL1K8V",
"parentId" : "CL1K8V",
}
Run Code Online (Sandbox Code Playgroud)
我试过$project了$group
db.keyword.aggregate([
{
$group: {
_id: "$llcId",
total: {$sum: 1},
}
},
{
$project: {
categoryId: 1, total: 1
}
}
])
Run Code Online (Sandbox Code Playgroud)
它给了我一个结果
{ "_id" : "CL1KJQ", "total" : 17 }
{ "_id" : "CL1KKW", "total" : 30 }
Run Code Online (Sandbox Code Playgroud)
但我需要的结果也如实际数据llcId,categoryId,keyword,total.我尝试使用显示cetgoryId和关键字, …
我想要正则表达式搜索MongoDB中的整数值.这可能吗?
我正在构建一个CRUD类型的接口,允许*在各个字段上使用通配符.我试图保持UI与整数的几个字段保持一致.
考虑:
> db.seDemo.insert({ "example" : 1234 });
> db.seDemo.find({ "example" : 1234 });
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 }
> db.seDemo.find({ "example" : /^123.*/ });
>
Run Code Online (Sandbox Code Playgroud)
如您所见,我插入一个对象,我可以通过值找到它.如果我尝试一个简单的正则表达式,我实际上找不到该对象.
谢谢!
我想做点什么
select campaign_id,campaign_name,count(subscriber_id),count(distinct subscriber_id)
group by campaign_id,campaign_name from campaigns;
Run Code Online (Sandbox Code Playgroud)
此查询给出除count之外的结果(distinct subscriber_id)
db.campaigns.aggregate([
{$match: {subscriber_id: {$ne: null}}},
{$group: {
_id: {campaign_id: "$campaign_id",campaign_name: "$campaign_name"},
count: {$sum: 1}
}}
])
Run Code Online (Sandbox Code Playgroud)
以下查询给出除count(subscriber_id)之外的结果
db.campaigns_logs.aggregate([
{$match : {subscriber_id: {$ne: null}}},
{$group : { _id: {campaign_id: "$campaign_id",campaign_name: "$campaign_name",subscriber_id: "$subscriber_id"}}},
{$group : { _id: {campaign_id: "$campaign_id",campaign_name: "$campaign_name"},
count: {$sum: 1}
}}
])
Run Code Online (Sandbox Code Playgroud)
但我希望count(subscriber_id),count(distinct subscriber_id)在同一个结果中
$lookup是MongoDB 3.2中的新功能.它对同一数据库中的未整数集合执行左外连接,以过滤来自"已连接"集合的文档以进行处理.
要使用$lookup,from集合不能分片.
另一方面,分片是一种有用的水平缩放方法.
将它们组合在一起的最佳做法是什么?