标签: aggregation-framework

如何在 Mongodb 映射中创建对象

我有一个如下所示的文档,我使用 mongo $map 来投影表内的字段并重命名键。$unwind由于某些内部复杂性,我无法使用。

{
"Table":[
    {"Lookup":{
        "CreatedBy":{
            "id": "User001",
            "Name":"UserName"
         }

        }
     }]
}
Run Code Online (Sandbox Code Playgroud)

我期望的输出看起来像这样

{
"Table":[
    {"Lookup":{
        "CreatedBy":"UserName"
        }
     }]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 mongo $map 来实现它,但不支持它

db.getCollection('TableDoc').aggregate([
        {
        "$project": {
            "Table": {
                "$map": {
                    "input": "$Table",
                    "in": {
                      "Lookup.CreatedAt": "$$this.Lookup.CreatedAt.Name",
                    }
                }               
             }
         }
        }
])
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以在不使用 $unwind 的情况下实现此目的

mongodb pymongo mongodb-query aggregation-framework

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

MongoDb 聚合组和排序应用程序

有结构的文档:

{"appId":<id>,"time":<number>}
Run Code Online (Sandbox Code Playgroud)

对于这个例子,我们假设我们有:

{"appId":"A","time":1}
{"appId":"A","time":3}
{"appId":"A","time":5}
{"appId":"B","time":1}
{"appId":"B","time":2}
{"appId":"B","time":4}
{"appId":"B","time":6}
Run Code Online (Sandbox Code Playgroud)

是否可以按 appId 对文档进行分组,每个组按时间排序,并且从该组的最新时间开始显示所有结果,例如:

{"appId":"B","time":6}
{"appId":"B","time":4}
{"appId":"B","time":2}
{"appId":"B","time":1}

{"appId":"A","time":5}
{"appId":"A","time":3}
{"appId":"A","time":1}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个查询:

collection.aggregate([{"$group":{"_id":{"a":"$appId"},"ttt":{"$max":"$time"}}},
{"$sort":{"_id.ttt":-1,"time":-1}}])
Run Code Online (Sandbox Code Playgroud)

但我只收到最后一次特定的 appId -> 2 结果,并且此查询更改了数据的结构。我想保留文档的结构,并且只像示例一样对它们进行分组和排序。

mongodb aggregation-framework

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

mongodb - 没有本地的聚合查找

所以我有两个ObjectId位于不同集合中的 s,我希望将其合并为输出。所以这就像使用$lookup没有任何本地字段的函数一样。如果没有聚合,我可以简单地执行两个操作.findOne,但这需要两次 API 调用(这将创建两个连接)。有可能一并实现吗?

因此,如果没有聚合,它看起来就像这样:

let main_document =
    db.findOne({
        _id: ObjectId(first)
    })

let subdocument =
    db.findOne({
        _id: ObjectId(second)
    })

main_document.subdocument = subdocument

return main_document
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb mongodb-query aggregation-framework

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

mongoDB 数组长度和缺失字段的总和

我有一个简单的文档,为用户存储对象数组,我希望获得这些数组的总和以及所有数组的总和;挑战在于某些文档缺少其他文档具有的字段,这导致我的聚合查询失败。

文档看起来像这样。

{
  name: '',
  type: '',
  cars: [],
  boats: [],
  planes: []
}
Run Code Online (Sandbox Code Playgroud)

有些人没有船或飞机......这些文件可能看起来像

{
  name: '',
  type: '',
  cars: []
}
Run Code Online (Sandbox Code Playgroud)

所以当我运行我的聚合时

[
  {
    '$match': {
      'type': 'big_spender'
    }
  }, {
    '$project': {
      'name': '$name', 
      'cars': {
        '$size': '$cars'
      }, 
      'boats': {
        '$size': '$boats'
      }, 
      'planes': {
        '$size': '$planes'
      }
    }
  }, {
    '$addFields': {
      'total_vehicles': {
        '$add': [
          '$cars', '$boats', '$planes'
        ]
      }
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我收到错误:“$size 的参数必须是数组,但类型为:缺失”

我很确定我可以使用 $exists 来避免这个问题,并返回 0,但我不知道该语法可能是什么样子。

我需要为不存在的数组返回 0,因此当我将它们添加到总数中时,我会得到正确的总数并且没有错误。

任何帮助表示赞赏。

arrays mongodb aggregation-framework

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

从 mongoDB 中随机选择 10 个文档

我正在学习 Node 和 mongo,目前正在开发一个简单的服务器,该服务器只会从 mongodb 中获取 10 个随机文档,并在收到 get 请求时将它们作为响应发送。我的下一个目标是创建一个页面,该页面将在 html 页面中显示这 10 条记录,并具有一些基本样式。该页面还有一个“下一步”按钮,可以从数据库中获取另外 10 条随机记录。问题是如何确保在此过程中不会两次提取相同的记录?

mongodb node.js aggregation-framework

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

MongoDB 删除或限制字段条件聚合

我在编写 find/aggregate mongo 查询时遇到一些问题,其中我的要求是获取所有文档,但条件如下:

假设我有 2 个文档:

{
  _id: 5ccaa76939d95d395791efd2,
  name: 'John Doe',
  email: 'john.doe@foobar.com',
  private: true
}

{
  _id: 5ccaa76939d95d395791efd2,
  name: 'Jane Doe',
  email: 'jane.doe@foobar.com',
  private: false
} 
Run Code Online (Sandbox Code Playgroud)

现在我试图弄清楚的查询是,如果该字段private为真,那么当我查询时,我必须获取除电子邮件字段之外的所有文档(如果private为真则不包括电子邮件字段),如下所示:

{
 _id: 5ccaa76939d95d395791efd2,
 name: 'John Doe',
 private: true
}

{
 _id: 5ccaa76939d95d395791efd2,
 name: 'Jane Doe',
 email: 'jane.doe@foobar.com',
 private: false
} 
Run Code Online (Sandbox Code Playgroud)

$redact在aggregate()中尝试过$cond,,,$$PRUNE以及$$DESCEND遇到$$REMOVE(看起来像是最新的功能),但无法获得所需的输出。请帮我查询

mongoose mongodb mongodb-query aggregation-framework

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

查找 MongoDB 中一系列日期中缺失的日期

我有一个collection包含serviceDate特定操作的字段。我需要查找给定的日期范围是否有serviceDate缺失,如果找到,则返回serviceDate datesMongoDB 中日期范围之间缺失的列表。我的集合的 JSON 示例如下。

{
    "_id" : ObjectId("5cefdb46bfbe1c0001f38413"),
    "category" : "RENT",
    "serviceDate" : ISODate("2019-06-15T05:30:00.000+05:30")
},


{
    "_id" : ObjectId("5cefdb46bfbe1c0001f38412"),
    "category" : "RENT",
    "serviceDate" : ISODate("2019-06-14T05:30:00.000+05:30")
},


{
    "_id" : ObjectId("5cefdb46bfbe1c0001f38411"),
    "category" : "RENT",
    "serviceDate" : ISODate("2019-06-13T05:30:00.000+05:30")
}
Run Code Online (Sandbox Code Playgroud)

示例:
情况 1: 如果集合有 10 个文档,并且服务日期从 2019 年 6 月 1 日到 2019 年 6 月 10 日开始。在我的查询中,我将 2019 年 6 月 4 日传递到 2019 年 6 月 7 日,结果应该为空。
情况 2: 如果集合有 9 …

javascript mongodb mongodb-query aggregation-framework

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

如何从 MongoDB 聚合中的不同集合添加多个 $match 条件

我有 2 个不同的 MongoDB 集合 -员工部门都包含共同的deptid。我想加入这两个集合并从两个集合中添加多个 $match 条件。

雇员:

{
    Empid: 001
    Name: "John"
    Age: 41
    Location: "Belfast"
    deptid: "D101"
}
Run Code Online (Sandbox Code Playgroud)

部门:

{
    deptID: "D101"
    deptNM: "HR"
    deptPr: "O"
}
Run Code Online (Sandbox Code Playgroud)

询问:

db.getCollection('Employees').aggregate([
    { $match:{
        deptNM: "HR",
        Age : {$gt: 40}
       }
    },
    { $lookup: {
        from: "Dept",
        localField: "deptid",
        foreignField: "deptID",
        as: "HR EMP"
        }
     },
     { $project: {
         Empid: 1, Name: 1, Location: 1, deptNM: 1, deptPr: 1
         }
     }
])
Run Code Online (Sandbox Code Playgroud)

上面的查询不起作用,还有其他方法吗?

join match mongodb aggregation-framework

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

MongoDB 聚合 $or 与 $elemMatch、$expr 在 $lookup 管道内

我有 2 个收藏:

用户收藏:

{
    _id: ObjectId
}
Run Code Online (Sandbox Code Playgroud)

托托系列:

{
    _id: ObjectId
    fieldA: {_id: ObjectId}
    fieldB: [{_id: ObjectId}, {_id: ObjectId}]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试加入 A 集合的元素,其中fieldA 的 id或fieldB 的 id之一与以下聚合的用户 id匹配:

db.users.aggregate([
{
  $lookup: {
    from: "Toto",
    let: { "user_id": "$_id" },
    as: "fcollection",
    pipeline: [
      { $match:  
        {$or:[
          {"fieldB": {$elemMatch: {"_id": "$$user_id"}}}, 
          {$expr: {$eq :["$fieldA._id", "$$user_id"]}}
        ]}
      }
    ]
  }
])
Run Code Online (Sandbox Code Playgroud)

但在输出中,我只是获取了文档中 fieldA 的 id 匹配的位置,但没有获取 fieldB 的 id 匹配的位置。我究竟做错了什么?

mongodb nosql mongodb-query aggregation-framework

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

Mongodb $addFields 如果为 null 则不输出数据

我正在努力解决一个恼人的问题。我在查询中使用聚合,我需要加入一些集合,并且输出必须是一个对象。这是我的代码...

usersModel.aggregate([
    {
        $match: { _id: ObjectId(req.params.id) }
    },
    {
        $lookup: {
            from: "agents",
            as: "agent",
            let: { "idAgent": "$agent" }, //$agent can be null
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ['$_id', "$$idAgent"] 
                        },
                    }
                }
            ],
        }
    },
    { $unwind: { path: '$agent', preserveNullAndEmptyArrays: true } },
    {
        $addFields: {
            agent: "$agent", //If $agent is null, it does not output the field agent...
        }
    }

])
Run Code Online (Sandbox Code Playgroud)

如果在最后一个Stage中,字段$agent为空,则$addFields不会输出该字段。还有其他方法可以做到吗?查找后我只需要代理字段作为对象。谢谢

mongodb mongodb-query aggregation-framework

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