【问题标题】:MongoDB: How do use aggregation framework to return objectIDs?MongoDB:如何使用聚合框架返回 objectID?
【发布时间】:2014-11-23 04:26:55
【问题描述】:

我正在尝试构建一个查询以返回符合此条件的所有帐户的 ObjectId:

  1. 状态不等于-1
  2. created_at 小于或等于 30 天前的午夜 UTC
  3. created_at 一个月中的某天等于今天的某天

我能够执行 #1 和 #2,但我被困在 #3 并且结果中还包括 ObjectId。

Account._get_collection().aggregate([
    { "$match": {
       "status": { "$ne": -1 },
       "created_at": { "$lte": datetime.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) - datetime.timedelta(days=30), }
    }},
    { "$group": {
        "_id": {
            "dayOfMonth" : { "$dayOfMonth": "$created_at" },
        },
    }},
    { "$project": {
        "_id": "1"
    }}
])

我知道比赛部分中的日期可能应该是向上的,并且需要在组部分中添加一些内容以返回 ObjectId。

我错过了什么?

【问题讨论】:

  • 能否请您从收藏中发布一个示例文档?

标签: python mongodb aggregation-framework


【解决方案1】:

修改$group$project 阶段如下。您需要跟踪组中所有记录的Object Ids,以便以后进行投影。所以在分组的时候,使用$push操作符来累加每组的所有对象id。

project 阶段,只显示它。

您的代码不正确,因为它投影的是每个组的 "_id"dayOfMonth)而不是文档本身。

{ "$group": {
    "_id": {
        "dayOfMonth" : { "$dayOfMonth": "$created_at" },
    },"objectIds":{$push:"$_id"}
}},
{ "$project": {
    "objectIds": 1
}}

【讨论】:

  • 谢谢!有用。我不得不将"objectIds": "1" 更改为"objectIds": 1
  • 是的,这是一个错字。
猜你喜欢
  • 2014-02-06
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多