标签: aggregation-framework

MongoDB聚合框架的绝对值

我正在使用MongoDB聚合框架,需要获取金额字段的绝对值,我在项目部分和组部分中使用,ex:

'$project' => {
          'amount' => 1,
          '_id' => 0
        }
Run Code Online (Sandbox Code Playgroud)

....

    '$group' => { 
      'total' => {'$sum' => '$amount'}
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您如何获取"金额"字段的绝对值?我无法在文档中找到它(也许它不可用?)

mongodb aggregation-framework

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

找一个人是否在接下来的30天里用mongo过生日

假设我们收到了一组用户,每个用户都以BSON类型的日期格式生日.

我们如何运行查询以查找在接下来的30天内过生日的所有用户?

mongodb aggregation-framework

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

MongoDB $ redact来过滤掉一些数组元素

我正在尝试对样本bios集合http://docs.mongodb.org/manual/reference/bios-example-collection/进行查询:

在获得图灵奖之前,检索他们收到的所有人及其奖励.

我想出了这个问题:

db.bios.aggregate([
    {$match: {"awards.award" : "Turing Award"}},
    {$project: {"award1": "$awards", "award2": "$awards", "first_name": "$name.first", "last_name": "$name.last"}},
    {$unwind: "$award1"},
    {$match: {"award1.award" : "Turing Award"}},
    {$unwind: "$award2"},
    {$redact: {
        $cond: {
           if: { $eq: [ { $gt: [ "$award1.year", "$award2.year"] }, true]},
           then: "$$KEEP",
           else: "$$PRUNE"
           }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

这就是答案:

/* 0 */
{
    "result" : [ 
    {
        "_id" : 1,
        "award1" : {
            "award" : "Turing Award",
            "year" : 1977,
            "by" : "ACM"
        },
        "award2" : …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

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

我有一个像

{
    "_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
查看次数

是否可以在Aggregation Frameworks mongo中按投影顺序获取字段

我有以下文件:

{ "_id" : 3, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "final" : 78, "midterm" : 70 }
{ "_id" : 1, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "midterm" : 70 }
Run Code Online (Sandbox Code Playgroud)

如果我运行以下查询:

   db.students.aggregate([  { "$project": {  "midterm": 1,"final": 1   } } ])
Run Code Online (Sandbox Code Playgroud)

结果如下:

{ "_id" : 3, "final" : 78, "midterm" : 70 }
{ "_id" : 1, "midterm" : 70 }
Run Code Online (Sandbox Code Playgroud)

如果我仍然在shell中更改投影中的顺序,则字段的顺序是相同的?我们可以根据查询的顺序重新获得订单吗?

db.students.aggregate([  { …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

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

如何将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
查看次数

$ aggregation和$查找同一个集合 - mongodb

结构或多或少像;

[   
    {id: 1, name: "alex" , children: [2, 4, 5]},
    {id: 2, name: "felix", children: []},
    {id: 3, name: "kelly", children: []},
    {id: 4, name: "hannah", children: []},
    {id: 5, name: "sonny", children: [6]},
    {id: 6, name: "vincenzo", children: []}
]
Run Code Online (Sandbox Code Playgroud)

childrenchildren数组不为空时,我想用名称替换id .

所以查询的结果是预期的;

[   {id: 1, name: "alex" , children: ["felix", "hannah" , "sonny"]}
    {id: 5, name: "sonny", children: ["vincenzo"]}
]
Run Code Online (Sandbox Code Playgroud)

我做了什么来实现这一目标;

db.list.aggregate([
  {$lookup: { from: "list", localField: "id", foreignField: "children", as: "children" }},
  {$project: …
Run Code Online (Sandbox Code Playgroud)

lookup mongodb aggregation-framework

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

MongoDB $ lookup不使用索引

我正在编写一个需要在两个表之间进行$ lookup的查询,据我所知,对ForeignField拥有索引以便及时执行此连接至关重要。但是,即使在字段上添加了索引之后,查询仍然会回退到COLLSCAN。

db.users.aggregate([
  {$lookup:{ from: "transactions", localField: '_id', foreignField: 'uid', as: 'transaction' }},
  { $match: { transaction: { "$size" : 0} } },
  { $count: "total"},
], { explain: true })
Run Code Online (Sandbox Code Playgroud)

返回:

"queryPlanner" : {
    "plannerVersion" : 1,
    "namespace" : "test.users",
    "indexFilterSet" : false,
    "parsedQuery" : {

    },
    "winningPlan" : {
        "stage" : "COLLSCAN",
        "direction" : "forward"
    },
    "rejectedPlans" : [ ]
}
Run Code Online (Sandbox Code Playgroud)

如前所述,我确实在事务集合中索引了uid字段:

> db.transactions.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        }, …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-shell mongodb-query aggregation-framework

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

如何使用MongoDB聚合进行分页?

我想执行一个执行基本分页的聚合查询:

  1. 查找属于某个特定的所有订单 company_id
  2. 按顺序排序 order_number
  3. 计算文件总数
  4. 跳到例如文档编号100并传递其余部分
  5. 将文档数量限制为例如2并传递它们
  6. 通过从文档中返回计数和选定的几个字段来完成

以下是查询的细分:

db.Order.collection.aggregate([
Run Code Online (Sandbox Code Playgroud)

这会找到所有匹配的文档:

  { '$match'    : { "company_id" : ObjectId("54c0...") } },
Run Code Online (Sandbox Code Playgroud)

这会对文件进行排序:

  { '$sort'     : { 'order_number' : -1 } },
Run Code Online (Sandbox Code Playgroud)

这会对文档进行计数并传递未经修改的文档,但我确信这样做是错误的,因为事情变得怪异了:

  {
    '$group' : {
      '_id'     : null,
      'count'   : { '$sum' : 1 },
      'entries' : { '$push' : "$$ROOT" }
    }
  },
Run Code Online (Sandbox Code Playgroud)

这似乎跳过一些文件:

  { "$skip"     : 100 },
Run Code Online (Sandbox Code Playgroud)

这应该限制文档,但它不会:

  { "$limit"    : 2 },
Run Code Online (Sandbox Code Playgroud)

这会返回计数,但它不会返回数组中的文档,而是返回包含每个字段的数组:

  { '$project'  : {
      'count'     : 1,
      'entries' …
Run Code Online (Sandbox Code Playgroud)

pagination mongodb aggregation-framework

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

MongoDB计算数组和无限子数组中的所有对象

{
    "ArticleName": "Example Article",
    "Comments": [
        {
            "Text": "Great Article",
            "Responses": [
                {
                    "Text": "No it isnt",
                    "Responses": [
                        {
                            "Text": "Yes it is"
                        }
                    ]
                },
                {
                    "Text": "Spot on"
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

每次出现的关键"文本"都会被视为注释(因此有4条评论).在Mongo中,最好的方法是什么?

arrays mongodb mongodb-query aggregation-framework

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