请考虑以下示例:
db.article.aggregate(
{ $group : {
_id : "$author",
docsPerAuthor : { $sum : 1 },
viewsPerAuthor : { $sum : "$pageViews" }
}}
);
Run Code Online (Sandbox Code Playgroud)
这个由作者字段分组并计算两个字段.
我有$ author = FirstName_LastName的值.现在不是按$ author分组,而是希望由共享相同LastName的所有作者进行分组.
我试过$ regex在'_'后按所有匹配的字符串分组
$author.match(/_[a-zA-Z0-9]+$/)
db.article.aggregate(
{ $group : {
_id : "$author".match(/_[a-zA-Z0-9]+$/),
docsPerAuthor : { $sum : 1 },
viewsPerAuthor : { $sum : "$pageViews" }
}}
);
also tried the following:
db.article.aggregate(
{ $group : {
_id : {$author: {$regex: /_[a-zA-Z0-9]+$/}},
docsPerAuthor : { $sum : 1 },
viewsPerAuthor …Run Code Online (Sandbox Code Playgroud) 假设我有以下集合:
{ _id: 1, Array: [
{ K: "A", V: 8 },
{ K: "B", V: 5 },
{ K: "C", V: 13 } ] }
{ _id: 2, Array: [
{ K: "D", V: 12 },
{ K: "E", V: 14 },
{ K: "F", V: 2 } ] }
Run Code Online (Sandbox Code Playgroud)
我想运行一个返回具有最高"V"的子文档的查询,所以在这种情况下我会得到:
{ _id: 1, Array: [ { K: "E", V: 14 } ] }
Run Code Online (Sandbox Code Playgroud)
或者干脆:
{ K: "E", V: 14 }
Run Code Online (Sandbox Code Playgroud)
重要的是我希望Mongo服务器上的内存使用量为O(1)(无论我处理多少文档,内存使用量是不变的),我只想检索那个我需要的值的子文档(我不想下载超过必要的更多子文档).
我首选的方法是使用简单的查找查询,但我不确定这是否可行.我怀疑这也可以通过聚合框架(或map reduce?)来完成,但是看不出来.我不希望结果存储在临时集合中,而是直接返回给我的客户端(就像普通查询一样).
我试图使用聚合框架(使用ruby)并像这样投影日期:
db['requests'].aggregate([
{"$project" => {
_id: 0,
method: '$method',
user: '$user',
year: {'$year' => '$timestamp'}
}}])
Run Code Online (Sandbox Code Playgroud)
该文件就像这样:
{
_id: ObjectId("5177d7d7df26358289da7dfd"),
timestamp: ISODate("2013-04-12T03:58:05+00:00"),
method: "POST",
status: "200",
inputsize: "874",
outputsize: "4981",
user: "131"
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Mongo::OperationFailure: Database command 'aggregate' failed: (errmsg: 'exception: can't convert from BSON type EOO to Date'; code: '16006'; ok: '0.0').
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为如果我在与mongorestore导入的完全相同的数据库上运行它,它可以正常工作.
我有一个问题:
db.test.aggregate( {$group : { _id : '$key', frequency: { $sum : 1 } } } )
Run Code Online (Sandbox Code Playgroud)
这将获得测试集中每个密钥枚举的频率.基本上,我已经得到了密钥的分配.
现在想象一下我想获得key1,key2和key3的分布(因此有三种不同的分布).
显然,我可以使用每个单独的键运行此查询3次,但似乎我们可以通过允许它同时计算所有3个键来优化查询.我一直在玩它并搜索整个网络间,但到目前为止,我已经被委托运行三个单独的聚合查询或使用map/reduce函数.
有没有人有任何其他想法?
我有一个类似的mongo文件
{ "_id" : 12, "location" : [ "Kannur","Hyderabad","Chennai","Bengaluru"] }
{ "_id" : 13, "location" : [ "Hyderabad","Chennai","Mysore","Ballary"] }
Run Code Online (Sandbox Code Playgroud)
从这里我如何获得位置聚合(不同的区域计数).就像是
Hyderabad 2,
Kannur 1,
Chennai 2,
Bengaluru 1,
Mysore 1,
Ballary 1
Run Code Online (Sandbox Code Playgroud) 我希望通过拥有$或者财产来获得$ cond的$ sum:
db.collectionName.aggregate(
{
"$group": {
"_id":'$created_at',
"count": {"$sum": 1},
"count_failure": {
"$sum": {
"$cond": [
{
"$id":
{ "$in": [ 0,100,101,102,103,104,105 ] }
},
1,
0
]
}
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
但错误说: Invalid operator "$id"
语法有什么问题?或者我错误地写了查询.
目前我通过以下方式实现此目标
db.collectionName.aggregate(
{
"$group": {
"_id":'$created_at',
"count": {"$sum": 1},
"count_failure": {
"$sum": {
"$cond": [
{
"$or":[
{ "$eq": [ "$id", 0 ] },
{ "$eq": [ "$id", 100 ]},
{ "$eq": [ "$id", 101 ]},
{ "$eq": [ "$id", 102 …Run Code Online (Sandbox Code Playgroud) 我们试图将一个字符串数组'连接'到聚合内的单个字符串.
给出以下数据集:
收集1:
{
id: 1234,
field: 'test'
}
Run Code Online (Sandbox Code Playgroud)
收集2:
{
id: 1111,
collection1_id: 1234,
name: 'Max'
},
{
id: 1112,
collection1_id: 1234,
name: 'Andy'
}
Run Code Online (Sandbox Code Playgroud)
当前结果(查找后等):
{
id: 1234,
field: 'test',
collection2: ['Max', 'Andy']
}
Run Code Online (Sandbox Code Playgroud)
期望的结果:
{
id: 1234,
field: 'test',
collection2: 'Max, Andy'
}
Run Code Online (Sandbox Code Playgroud)
是否有可能将'collection2'加入单个字符串?我们尝试过,$concat但它只接受字符串.
在MongoDB中,我需要能够在主文档内的数组内的文档中展开嵌套数组.
{
"_id" : ObjectId("5808d700536d1a3d69f4cf51"),
"last_name" : "Maity",
"xiith_mark" : 58,
"id" : "3539488",
"first_name" : "Harshavardhan",
"course_name" : "BE/B.Tech",
"institute_name_string" : "Abhayapuri College, P.O. Abhayapuri",
"profile_percentage" : 45,
"xiith_mark_type" : "Percentage",
"xth_mark_type" : "Percentage",
"date_of_birth" : "14-April-1993",
"xth_mark" : 30,
"last_login" : 1470827224,
"percentage" : 55,
"job_details" : [
{
"status" : NumberLong(6),
"applied_date" : NumberLong(1470831441),
"job_id" : NumberLong(92928),
"contact_viwed_status" : 0,
"label_name" : [
"shortlisted",
"rejected"
],
"questionnaire_status" : 0,
"batch_id" : NumberLong(6),
"call_letter" : NumberLong(812)
},
{ …Run Code Online (Sandbox Code Playgroud) 我有一个如下文件:
{
"user_id": NumberLong(1),
"updated_at": ISODate("2016-11-17T09:35:56.200Z"),
"created_at": ISODate("2016-11-17T09:35:07.981Z"),
"banners": {
"normal_x970h90": "/images/banners/4/582d79cb3aef567d64621be9/photo-1440700265116-fe3f91810d72.jpg",
"normal_x468h60": "/images/banners/4/582d79cb3aef567d64621be9/photo-1433354359170-23a4ae7338c6.jpg",
"normal_x120h600": "/images/banners/4/582d79cb3aef567d64621be9/photo-1452570053594-1b985d6ea890.jpg"
},
"name": "jghjghjghj",
"budget": "2000",
"plan": null,
"daily_budget": "232323",
"daily_budget_auto": "",
"href": "qls2.ir",
"targets": {
"cats": [
"fun",
"news"
],
"region": "inIran",
"iran_states": null,
"os": "all",
"gold_network": true,
"dont_show_between_1_n_8": true
},
"payment": {
"bank": "mellat",
"tax": "add"
},
"click_cost": "102000",
"status": null
}
Run Code Online (Sandbox Code Playgroud)
我想检查是否budget低于click_cost我在检查查询中的其他参数时:
db.bcamp.aggregate(
[
{
$match:{
$and: [
{"targets.cats":{
"$in" : ["all"]
}
},
{"banners.normal_x970h90":{
"$exists":true
}
}, …Run Code Online (Sandbox Code Playgroud) 我的taxon集合中有以下架构:
{
"_id": 1,
"na": [ "root_1",
"root_2",
"root_3" ],
"pa": 1
},{
"_id": 2,
"na": [ "name_1",
"name_2",
"name_3"],
"pa": 1
},{
"_id": 4,
"na": [ "otherName_1",
"otherName_2",
"otherName_3"],
"pa": 2
}
Run Code Online (Sandbox Code Playgroud)
每个文档都由父字段与另一个文档相关联,该字段对应于_id其父项.
我想执行递归搜索以获得以下结果:
{ "_id": 4,
"nameList": [ "otherName_1",
"name_1",
"root_1"]
}
Run Code Online (Sandbox Code Playgroud)
从某个文件中_id获取na每个父项的数组的第一项,直到_id: 1达到 文档为止
我目前通过执行X查询得到这个结果(一个通过父文档,例如这里有3个),但我很确定这可以使用单个查询来实现.我已经看过新的$ graphLookup操作符了,但无法用它来解决问题...
是否可以使用MongoDB 3.4.1在单个查询中实现此目的?
编辑
我每次都会运行50个文档,因此最佳解决方案是将所有内容组合在一个查询中
例如,它看起来像
var listId = [ 4, 128, 553, 2728, ...];
var cursor = db.taxon.aggregate([
{$match: …Run Code Online (Sandbox Code Playgroud)