标签: aggregation-framework

Mongodb聚合,在$group_id的表达式中使用变量的值

我正在尝试按两个字段对文档进行分组,field1并且field2.

myCollection.aggregate([{
  $group: {
    _id: {
      group1: "$field1",
      group2: "$field2"
    },
    count: {
      $sum: 1
    }
  }
}])
Run Code Online (Sandbox Code Playgroud)

效果很好,可以产生预期的结果。

但我想在循环中重新运行上面的代码,每次运行都会有不同的结果$field2,所以下面的代码失败了,我该怎么办?谢谢

myCollection.aggregate([{
  $group: {
    _id: {
      group1: "$field1",
      group2: "$field2"
    },
    count: {
      $sum: 1
    }
  }
}])
Run Code Online (Sandbox Code Playgroud)

javascript mongodb mongodb-query aggregation-framework mongodb-aggregation

1
推荐指数
1
解决办法
4931
查看次数

当前文档字段值内的地理空间 $near

采取这个查询:

{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } }
Run Code Online (Sandbox Code Playgroud)

我想将当前评估文档中指定字段的值分配给 $maxDistance 。那可能吗?

geospatial mongodb mongodb-query aggregation-framework spring-mongodb

1
推荐指数
1
解决办法
1146
查看次数

从 MongoDB 集合中获取前 N 条和后 N 条记录

我有一个用例,需要显示组和排序聚合中的前 10 名和最后 10 名结果。我尝试使用$limit,但这不会让下一个聚合器处理完整的数据。

db.collection.aggregate([groupAggregator, sortAggregator, { $limit: 10 }, /*only 10 records available*/] 
Run Code Online (Sandbox Code Playgroud)

如何在管道中间对整个集合执行聚合?我在用MongoDB 3.2.9。如果这是不可能的,有没有办法联合两个聚合,第一个是 ,top 10 (ASC SORTED)第二个是last 10 (DESC SORTED)

如果不是为了小组聚合,我会使用该db.collection.find({}).sort().filter()策略,但小组需要完成。

组聚合得到的数据

{_id: "", ..., avg_count: 10}
{_id: "", ..., avg_count: 1}
{_id: "", ..., avg_count: 2}
{_id: "", ..., avg_count: 5}
{_id: "", ..., avg_count: 8}
{_id: "", ..., avg_count: 3}
{_id: "", ..., avg_count: 4}
{_id: "", ..., avg_count: 6}
{_id: "", ..., avg_count: …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

1
推荐指数
1
解决办法
3458
查看次数

在 $unwind 之前检查子文档是否不为空

我有一个包含 job_title、job_location、salary 等的Job schema

ApplicationSchema将子文档嵌入到作业文档中,它存储该特定作业已收到的所有申请

这是作业架构的样子

const jobSchema = new Schema({
  job_title : {
    type : String,
    required : true
  },
  job_location : {
    type : String,
  },
  salary : {
    type : Number
  },
  applications: [ApplicationSchema],
  companyId : {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Company'
  }
},{timestamps : true});

var Job = mongoose.model('Job', jobSchema);

module.exports = Job;
Run Code Online (Sandbox Code Playgroud)

您可以看到上面的应用程序子文档。

这是当没有特定工作申请时我的工作文档的样子

 {
"_id" : ObjectId("5ac873c3bb7a9c3168ff159e"),
    "applications" : [],
    "job_title" : "Junior Developer",
    "companyId" : ObjectId("5ac870d0bb7a9c3168ff159c"),
    "createdAt" : ISODate("2018-04-07T07:31:15.257Z"),
    "updatedAt" : ISODate("2018-04-07T09:20:52.237Z"), …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

1
推荐指数
1
解决办法
1857
查看次数

如何在日期之间使用 $gte 和 $lte 以及 `$filter`

我有一个代码查询$gte日期,它工作正常。

cityCollection.aggregate([
    { 
      "$project": { 
          theater: true,
          movie: {
            $filter: {
              input: {
                $map: {
                  input: "$movie",
                  as: "movie",
                  in: {
                      cnName: "$$movie.cnName",
                      enName: "$$movie.enName",
                      releasedTime: {
                        $filter: {
                          input: "$$movie.releasedTime",
                          as: "movie",
                          cond: { $and:{
                            $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ]
                          }}
                        }
                      }
                  }
                }
              },
              as: "movie",
              cond: "$$movie"
            }
          }
      }
    }
])
    .then(drivers => res.send(drivers))
    .catch(next);
Run Code Online (Sandbox Code Playgroud)

现在我想在两个日期之间查询,我尝试$lte在代码中添加如下内容:

releasedTime: {
   $filter: {
      input: "$$movie.releasedTime",
      as: "movie",
      cond: {
        $gte: [ "$$movie", …
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

1
推荐指数
1
解决办法
5328
查看次数

聚合执行统计数据 (Mongo)

我可以在文档中看到可用于某些 mongo 查询的文档,这确实很有帮助,但除了没有提供太多信息的标志explain("executionStats")之外,我看不到聚合查询的此类实用程序。explain是否有计划将完整概述也集成到聚合查询中?

aggregation mongodb mongodb-query aggregation-framework

1
推荐指数
1
解决办法
3646
查看次数

如何在 mongo-go-driver 中使用 ParseExtJSONArray() 解析聚合管道中的扩展 JSON 日期

我有一个带有日期字段的集合:

{
    "_id" : ObjectId("5b92b359ddceef5b24502834"),
    "dateTimeGMT" : ISODate("2018-08-22T09:29:25.000Z"),
    yada, yada, yada
}
Run Code Online (Sandbox Code Playgroud)

我试图使用 mongo-go-driver 的 ParseExtJSONArray 函数在 $match 聚合阶段按日期查找。(我知道如何直接使用 *bson.Array 执行此操作。我问是为了知道使用 ParserExtJSONArray 执行此操作的正确方法,或者如果我遇到了限制。)

我已简化此示例并确认它与上述文档不匹配。

pipeline, err := bson.ParseExtJSONArray(`[
    { "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }
]`)
cursor, err := receivedFromResponseQueue.Aggregate(ctx, pipeline)
Run Code Online (Sandbox Code Playgroud)

以下内容在 mongo shell 中不起作用。(这并不奇怪,因为它会自动转换为 ISODate() 格式)

db.getCollection('received_from_response_queue').aggregate([
    { "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }
])
Run Code Online (Sandbox Code Playgroud)

但这在 mongo shell 中确实有效。

db.getCollection('received_from_response_queue').aggregate([
    { "$match": { "dateTimeGMT": ISODate("2018-08-22T09:29:25.000Z") } }
])
Run Code Online (Sandbox Code Playgroud)

但这会在“pipeline”中返回一个空数组。(因为 ParseExtJSONArray 不处理 JavaScript)

pipeline, err := bson.ParseExtJSONArray(`[
    { "$match": { "dateTimeGMT":ISODate("2018-08-22T09:29:25.000Z") } …
Run Code Online (Sandbox Code Playgroud)

go mongodb aggregation-framework mongo-go

1
推荐指数
1
解决办法
2256
查看次数

限制 $lookup 聚合中的字段

MongoDB 数据库版本 3.4.18。

我想合并来自外部集合的数据,但我不想拥有所有键,我想做出限制,如下所示:

db.users.find({}, {password:0}, (err, docs) => {});
Run Code Online (Sandbox Code Playgroud)

这是我的聚合查询:

let query = [
  {
    // match from first collection (activities)
    $match: {
      "_id": ObjectId("5be46f266e4a182384b3ae6a")
    }
  },
  {
    // limit fields from first collection (activities)
    $project: {
      "_user": 1,
      date: 1
    }
  },
  {
    // join a foreign collection - but how to avoice the password key? for example.
    $lookup: {
      from: "users",
      localField: "_user",
      foreignField: "_id",
      as: "user"
    }
  }
];
db.activities.aggregate(query, (err, docs) => {
  console.log(docs[0].user);
  return …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

1
推荐指数
1
解决办法
1493
查看次数

MongoDB - 嵌套数组中的总和值

我有一个看起来像这样的对象

{
    "_id" : {
        "import_type" : "MANUAL_UPLOAD",
        "supplier" : "jabino.de",
        "unit_price" : "0"
    },
    "statuses" : [ 
        {
            "status" : "DUPLICATED",
            "count" : 14
        }, 
        {
            "status" : "BLACKLISTED",
            "count" : 2
        }, 
        {
            "status" : "USABLE",
            "count" : 2239
        }, 
        {
            "status" : "INVALID_EMAIL_ADDRESS",
            "count" : 1
        }, 
        {
            "status" : "DUPLICATED",
            "count" : 14
        }, 
        {
            "status" : "BLACKLISTED",
            "count" : 2
        }, 
        {
            "status" : "USABLE",
            "count" : 2239
        }, 
        {
            "status" : "INVALID_EMAIL_ADDRESS",
            "count" : …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb mongodb-query aggregation-framework

1
推荐指数
1
解决办法
1151
查看次数

MongoDB 聚合函数,用于返回特定日期范围内的按日计数

我还需要每天获取特定日期范围内的个人用户数量。假设一个月内(1 日 - 30 日)总共有 100 个用户,我需要像这样获得计数

{
    1st - 2 users
    2nd - 10 users
}

MessagesSchema.statics.totalMessagesGraph = (id, startDate, endDate, platform) => {
    return Messages.aggregate([
        {
            $match: {
                id: id,
                platform: platform,
                timestamp: {
                    $gte: new Date(startDate),
                    $lte: new Date(endDate)
                }
            }
        }    
    ])
}
Run Code Online (Sandbox Code Playgroud)

为了获得想要的结果,这里应该做什么?

预期结果:

对于该特定日期范围,每天的计数。

{
    date1 - 20,
    date2 - 22,
    date3 - 24,
    ...
    date30 - 12 
}
Run Code Online (Sandbox Code Playgroud)

预期输出应如上所示。之后应该进行什么查询$match。如果可能,请获取样本数据集并提供输出。

mongoose node.js aggregation-framework

1
推荐指数
1
解决办法
1504
查看次数