首页 > 解决方案 > 基于对象数组中匹配对象内的日期进行过滤

问题描述

我们有一组看起来像这样的文档: 在此处输入图像描述

时间线包含特定对象发生的不同事件。我试图找到一种方法来根据对象中的日期过滤timeline对象status CREATED

如果我理解正确,我必须通过聚合来完成。该方向的一篇可能的文章是:https ://docs.mongodb.com/manual/reference/operator/aggregation/first-array-element/

我正在考虑的方式是将此匹配的时间线项目添加为附加字段并在其上进行匹配。

有没有更简单(更快)的方法来实现它?

我正在寻找的结果是某个月份内基于a 下项目中的date字段的文档集合。因此,每个文档都有一个带有 status的对象。该对象有一个字段。我需要按此过滤集合。然后在过滤后的集合上运行一堆聚合。CREATEDtimelinetimelineCREATEDdate

编辑- 添加更多数据

完整文件

{
    "_id": {
        "$oid": "55762fbf86c273233aebc101"
    },
    "from": {
        "nickname": "Savings",
        "type": "SYNAPSE-US",
        "id": "5574edcc86c27322ef865ea4",
        "user": {
            "legal_names": [
                "Some new name"
            ],
            "_id": "557387ed86c27318532fc09a"
        }
    },
    "extra": {
        "ip": "192.168.0.1",
        "supp_id": "1283764wqwsdd34wd13212",
        "webhook": "http://requestb.in/1acojwy1",
        "process_on": {
            "$date": "2015-06-10T00:13:51.263Z"
        },
        "note": "Deposit to bank account",
        "created_on": {
            "$date": "2015-06-09T00:13:51.263Z"
        },
        "other": {
            "skip_validation": false,
            "do_next": true
        },
        "latlon": "0,0",
        "same_day": false
    },
    "timeline": [
        {
            "date": {
                "$date": "2015-06-09T00:13:51.263Z"
            },
            "status": "CREATED",
            "note": "Transaction created",
            "status_id": "1"
        },
        {
            "status": "CANCELED",
            "note": "",
            "datetime": {
                "$date": "2015-06-25T00:37:00.515Z"
            },
            "status_id": "-1"
        },
        {
            "date": {
                "$date": "2015-07-07T07:16:44.756Z"
            },
            "status": "CREATED",
            "note": "Transaction unqueued",
            "status_id": "1"
        },
        {
            "date": {
                "$date": "2015-07-07T07:16:44.809Z"
            },
            "status": "PROCESSING-DEBIT",
            "note": "Transaction debit being processed.",
            "status_id": "2"
        },
        {
            "date": {
                "$date": "2015-07-07T07:16:44.853Z"
            },
            "status": "PROCESSING-CREDIT",
            "note": "Transaction credit being processed.",
            "status_id": "3"
        },
        {
            "date": {
                "$date": "2015-07-07T07:16:47.051Z"
            },
            "status": "SETTLED",
            "note": "Transaction credit has been made.",
            "status_id": "4"
        }
    ],
    "to": {
        "nickname": "ACH-US",
        "type": "ACH-US",
        "id": "5574d23b86c27354b2db471e",
        "user": {
            "legal_names": [
                "Some new name"
            ],
            "_id": "557387ed86c27318532fc09a"
        }
    },
    "amount": {
        "currency": "cUSD",
        "amount": 1010
    },
    "client": {
        "id": 844,
        "name": "Sankaet Pathak"
    },
    "fees": [
        {
            "note": "Synapse Facilitator Fee",
            "to": {
                "id": "559339aa86c273605ccd35df"
            },
            "fee": 25
        },
        {
            "note": "Facilitator Fee",
            "to": {
                "id": "559339aa86c273605ccd35df"
            },
            "fee": 100
        }
    ],
    "recent_status": {
        "date": {
            "$date": "2015-07-07T07:16:47.051Z"
        },
        "status": "SETTLED",
        "note": "Transaction credit has been made.",
        "status_id": "4"
    },
    "_v": 2
}

标签: mongodbfilteraggregate

解决方案


因此,根据我的理解,您可以在时间线中拥有多个CREATED,但如果该条目在您查询文档的月份存在,则可以检索。这是$elemMatch用于查找这些文档的聚合...

Enterprise atlas-7aocnr-shard-0 [primary]> db.collection.find( { timeline: { $elemMatch: { status: "CREATED", $and: [ { date: { $gte: ISODate("2015-06-01") } }, { date: { $lt: ISODate("2015-07-01") } } ] } } } )
[
  {
    _id: ObjectId("55762fbf86c273233aebc101"),
    from: {
      nickname: 'Savings',
      type: 'SYNAPSE-US',
      id: '5574edcc86c27322ef865ea4',
      user: {
        legal_names: [ 'Some new name' ],
        _id: '557387ed86c27318532fc09a'
      }
    },
    extra: {
      ip: '192.168.0.1',
      supp_id: '1283764wqwsdd34wd13212',
      webhook: 'http://requestb.in/1acojwy1',
      process_on: 2015-06-10T00:13:51.263Z,
      note: 'Deposit to bank account',
      created_on: 2015-06-09T00:13:51.263Z,
      other: { skip_validation: false, do_next: true },
      latlon: '0,0',
      same_day: false
    },
    timeline: [
      {
        date: 2015-06-09T00:13:51.263Z,
        status: 'CREATED',
        note: 'Transaction created',
        status_id: '1'
      },
      {
        status: 'CANCELED',
        note: '',
        datetime: 2015-06-25T00:37:00.515Z,
        status_id: '-1'
      },
      {
        date: 2015-07-07T07:16:44.756Z,
        status: 'CREATED',
        note: 'Transaction unqueued',
        status_id: '1'
      },
      {
        date: 2015-07-07T07:16:44.809Z,
        status: 'PROCESSING-DEBIT',
        note: 'Transaction debit being processed.',
        status_id: '2'
      },
      {
        date: 2015-07-07T07:16:44.853Z,
        status: 'PROCESSING-CREDIT',
        note: 'Transaction credit being processed.',
        status_id: '3'
      },
      {
        date: 2015-07-07T07:16:47.051Z,
        status: 'SETTLED',
        note: 'Transaction credit has been made.',
        status_id: '4'
      }
    ],
    to: {
      nickname: 'ACH-US',
      type: 'ACH-US',
      id: '5574d23b86c27354b2db471e',
      user: {
        legal_names: [ 'Some new name' ],
        _id: '557387ed86c27318532fc09a'
      }
    },
    amount: { currency: 'cUSD', amount: 1010 },
    client: { id: 844, name: 'Sankaet Pathak' },
    fees: [
      {
        note: 'Synapse Facilitator Fee',
        to: { id: '559339aa86c273605ccd35df' },
        fee: 25
      },
      {
        note: 'Facilitator Fee',
        to: { id: '559339aa86c273605ccd35df' },
        fee: 100
      }
    ],
    recent_status: {
      date: 2015-07-07T07:16:47.051Z,
      status: 'SETTLED',
      note: 'Transaction credit has been made.',
      status_id: '4'
    },
    _v: 2
  }
]

推荐阅读