标签: aggregation-framework

如何使用聚合框架创建新的数组字段

我开始使用mongoDb而且我遇到了一个简单的用例.

假设我有一个集合'aCollection',其条目如下:

{ 
    _id: ObjectId(123),
    lat: 48,56623,
    long: 2,56332
}
Run Code Online (Sandbox Code Playgroud)

我想用这样的条目创建一个新的集合:

{ 
    _id: ObjectId(123),
    lat: 48,56623,
    long: 2,56332,
    geometry : { 
        type: "Point",
        coordinates: [48,56623, 2,56332]
    }
}
Run Code Online (Sandbox Code Playgroud)

我想到了聚合框架:

db.aCollection.aggregate([{$project: { 
    _id: 1,
    lat: 1,
    long: 1,
    geometry: { 
        type: {$concat: ["Point"]},
        coordinates: ["$lat", "$long"]
    }
}}])
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我得到这个例外:

"异常:对象表达式中不允许的字段类型数组(位于'坐标')"

以下聚合正在起作用,但它不会产生预期的结果:

db.aCollection.aggregate([{$project: { 
    _id: 1,
    lat: 1,
    long: 1,
    geometry: { 
        type: {$concat: ["Point"]},
        coordinates: "$lat"
    }
}}])
Run Code Online (Sandbox Code Playgroud)

如何在没有聚合框架的情况下使用聚合框架2)继续创建此集合1)

谢谢

mongodb mongodb-query aggregation-framework

8
推荐指数
2
解决办法
9970
查看次数

MongoDB,多次计数(使用$ exists)

我有这3个请求:

db.mycollection.count({requestA:{$exists:true}})
db.mycollection.count({requestB:{$exists:true}})
db.mycollection.count({requestC:{$exists:true}})
Run Code Online (Sandbox Code Playgroud)

我只想提出一个请求......所以我尝试了以下方法:

db.mycollection.aggregate( [
    { $group: {
        '_id' : { user_id: '$user_id'},
        requestA_count: { $sum: {
            $cond: [ {requestA:{'$exists':true}}, 1, 0 ]
        } },
        requestB_count: { $sum: {
            $cond: [ {requestB:{'$exists':true}}, 1, 0 ]
        } },
        requestC_count: { $sum: {
            $cond: [ {requestC:{'$exists':true}}, 1, 0 ]
        } },
    } },
    { $project: {
        _id: 0,
        user_id: '$_id.user_id',
        requestA_count: 1,
        requestB_count: 1,
        requestC_count: 1
    } }
] );
Run Code Online (Sandbox Code Playgroud)

但我得到了错误:

"errmsg" : "exception: invalid operator '$exists'",
Run Code Online (Sandbox Code Playgroud)

我想我们不能在$ project中使用$ exists. …

mongodb mongodb-query aggregation-framework

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

MongoDB - 两个多边形的地理空间交集

有没有什么方法可以使用符合以下条件的mongodb地理空间查询来查询和获取位置数据?

  • 获取两个框之间或两个多边形之间交叉点的所有位置.

例如,下面我们可以在查询输出中只获得黄色区域内的那些位置,这些位置实际上是紫色和红色几何对象[多边形]的公共区域?

在此输入图像描述

我到目前为止对mongodb文档的研究

用例

    db.places.find( {
   loc: { $geoWithin: { $box:  [ [ 0, 0 ], [ 100, 100 ] ] } }
} )
Run Code Online (Sandbox Code Playgroud)

上面的查询提供了一个矩形几何区域内的结果[我正在寻找两个这样的单个查询共有的位置]

    db.places.find( {
   loc: { $geoWithin: { $box:  [ [ 0, 0 ], [ 100, 100 ] ] } }
} )

    db.places.find( {
   loc: { $geoWithin: { $box:  [ [ 50, 50 ], [ 90, 120 ] ] } }
} )
Run Code Online (Sandbox Code Playgroud)

javascript geospatial mongodb mongodb-query aggregation-framework

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

如何避免在mongo聚合框架中推送$推送空值

如果该字段不存在,$ push将聚合空值.我想避免这个.

有没有办法为$ push运算符创建一个子表达式,以便跳过空值而不将其推入结果数组?

mongodb mongodb-query aggregation-framework

8
推荐指数
2
解决办法
6112
查看次数

使用聚合在mongoDB中限制和排序每个组

如何在mongoDB中对每个组进行排序和限制.

考虑以下数据:

Country:USA,name:xyz,rating:10,id:x
Country:USA,name:xyz,rating:10,id:y
Country:USA,name:xyz,rating:10,id:z
Country:USA,name:abc,rating:5,id:x
Country:India,name:xyz,rating:5,id:x
Country:India,name:xyz,rating:5,id:y
Country:India,name:abc,rating:10,id:z
Country:India,name:abc,rating:10,id:x
Run Code Online (Sandbox Code Playgroud)

现在说我将按国家分组并按评级排序,并将每组的数据限制为2.

所以答案是:

Country:USA
name:xyz,rating:10,id:x
name:xyz,rating:10,id:y
Country:India
name:abc,rating:10,id:x
name:abc,rating:10,id:z
Run Code Online (Sandbox Code Playgroud)

我想只使用聚合框架来实现这一点.

我尝试将汇总排序用于评级,但只是查询在处理后没有结果.

sorting mongodb mongodb-query aggregation-framework

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

如何使用相应文档的数组获取每个组的字段的最大值?

我有一个像

{
    "_id" : ObjectId("5738cb363bb56eb8f76c2ba8"),
    "records" : [
        {
            "Name" : "Joe",
            "Salary" : 70000,
            "Department" : "IT"
        }
    ]
},
{
    "_id" : ObjectId("5738cb363bb56eb8f76c2ba9"),
    "records" : [
        {
            "Name" : "Henry",
            "Salary" : 80000,
            "Department" : "Sales"
        },
        {
            "Name" : "Jake",
            "Salary" : 40000,
            "Department" : "Sales"
        }
    ]
},
{
    "_id" : ObjectId("5738cb363bb56eb8f76c2baa"),
    "records" : [
        {
            "Name" : "Sam",
            "Salary" : 90000,
            "Department" : "IT"
        },
        {
            "Name" : "Tom",
            "Salary" : 50000,
            "Department" : "Sales" …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

Mongodb聚合:将日期转换为另一个时区

我保存我的交易,例如:

{code: "A", total: 250000, timestamp: ISODate("2016-01-20T23:57:05.771Z")},
{code: "B", total: 300000, timestamp: ISODate("2016-01-20T05:57:05.771Z")}
Run Code Online (Sandbox Code Playgroud)

每个事务都有timestampUTC时区下的字段.由于我住在雅加达(UTC + 7)时区,我需要在聚合之前将7小时添加到我的时间戳.这是我的mongo语法:

db.transaction.aggregate(
[
 {
   $project:
     {
       year: { $year: "$timestamp" },
       month: { $month: "$timestamp" },
       day: { $dayOfMonth: "$timestamp" }
     }
 }
])
Run Code Online (Sandbox Code Playgroud)

它返回:

    {
        "_id" : ObjectId("56a01ed143f2fd071793d63b"),
        "year" : 2016,
        "month" : 1,
        "day" : 20
    },
    {
        "_id" : ObjectId("56a01ed143f2fd071793d63b"),
        "year" : 2016,
        "month" : 1,
        "day" : 20
    }
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为第一次交易(代码A)发生在1月21日,但由于它被转换为UTC(-7小时),它变成了ISODate("2016-01-20T23:57:05.771Z")

注意:我在这里也知道同样的问题,这是我到目前为止所尝试过的:

db.transaction.aggregate( …
Run Code Online (Sandbox Code Playgroud)

datetime date mongodb aggregation-framework

8
推荐指数
3
解决办法
1万
查看次数

拥有组时,MongoDB聚合框架非常慢

我正在尝试进行聚合查询"group"以获得结果总数.

"requested_items"(我的结果)总数为+ - 1.900.000.

如果我使用"group"执行,则查询非常慢(+ - 300秒).

如果我执行没有"组",查询速度非常快(+ - 1秒).

我究竟做错了什么?

示例代码如下.

慢慢的查询

db.minute.aggregate([
    { $match: {
        $and: [
            { "status": "Homologado" },
            { "requested_items.status": /aceito/i },
        ]
    } },
    { $sort: {'_id': 1}},
    { $unwind: "$requested_items" },
    { $unwind: "$requested_items.winner" },
    { $match: {
        $and: [
            { "status": "Homologado" },
            { "requested_items.status": /aceito/i },
        ]
    } },
    { $project: {
        "_id": 1
    } },
    { $group: {
        "_id" : null,
        "total" : {$sum: 1},
    } }, …
Run Code Online (Sandbox Code Playgroud)

performance mongodb aggregation-framework

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

如何将Mongodb时间点数据分组到连续的时间组?

我有一个类似于以下形式的决策文件集合:

    { 
    _id: ObjectId("23de23802fe925b6ef7162a4"),
    userId: 6de4, 
    decision: true, 
    datetime:ISODate("2016-07-27T08:22:47.169Z")
    },
    { 
    _id: ObjectId("507f1f77bcf86cd799439011"),
    userId: 23f4, 
    decision: true, 
    datetime:ISODate("2016-02-03T11:48:50.456Z")
    },
.
.
.
Run Code Online (Sandbox Code Playgroud)

我正在努力想出一种将这些文档分组为连续日期时间组的方法.即文档应该属于特定组,如果它小于,比如组中至少一个其他文档的5分钟.

目标是实现在"会话"中做出的决策群.然后可以使用聚合(例如每个决策的平均时间等)对这些"会话"组进行进一步的见解.

如果不能使用MongoDb的聚合框架,可以使用map-reduce或其他方法完成.我愿意接受建议.

澄清

描述问题的另一种方法是将以下算法应用于文档集合.

  1. 首先将文档放入日期时间顺序.
  2. 将最早出现的文件(按时间顺序排列)放在自己的 组中,然后转到下一个文档.
  3. 如果下一个文档的日期时间小于一个文档之后的指定时间(比如5分钟),则将其放在之前相同的组中.如果没有,请创建一个新组并将此文档放入其中.
  4. 重复步骤3.直到遍历所有文档.

这将使集合具有所需的"会话"分组.当然,这只是描绘问题的一种方式.我不知道有什么方法可以遍历有序集合,同时使用MongoDb以这种方式进行分组.

可以这样做吗?有没有其他方法可以使用MongoDb获得相同的结果?

mapreduce mongodb mongodb-query aggregation-framework

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

Mongodb,使用$ lookup进行聚合查询

有两个收藏,标签和人.

标签型号:

{
  en: String,
  sv: String
}
Run Code Online (Sandbox Code Playgroud)

人物模型:

{
  name: String,
  projects: [
    title: String,
    tags: [
      {
        type: Schema.ObjectId,
        ref: 'tag'
      }
    ]
  ]

}
Run Code Online (Sandbox Code Playgroud)

我想查询返回人员模型中使用的所有标签.所有文件.

有点喜欢

var query = mongoose.model('tag').find({...});
Run Code Online (Sandbox Code Playgroud)

或者我应该以某种方式使用聚合方法?

mongoose mongodb mongodb-query aggregation-framework

8
推荐指数
1
解决办法
3万
查看次数