mongodb - 基于对象数组中匹配对象内的日期进行过滤
问题描述
时间线包含特定对象发生的不同事件。我试图找到一种方法来根据对象中的日期过滤timeline
对象status
CREATED
。
如果我理解正确,我必须通过聚合来完成。该方向的一篇可能的文章是:https ://docs.mongodb.com/manual/reference/operator/aggregation/first-array-element/
我正在考虑的方式是将此匹配的时间线项目添加为附加字段并在其上进行匹配。
有没有更简单(更快)的方法来实现它?
我正在寻找的结果是某个月份内基于a 下项目中的date
字段的文档集合。因此,每个文档都有一个带有 status的对象。该对象有一个字段。我需要按此过滤集合。然后在过滤后的集合上运行一堆聚合。CREATED
timeline
timeline
CREATED
date
编辑- 添加更多数据
完整文件
{
"_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
}
解决方案
因此,根据我的理解,您可以在时间线中拥有多个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
}
]
推荐阅读
- windows - 从行为类似于键盘的 USB HID 设备读取
- jpeg - 错误“不是 JPEG 文件:以 0x00 0x00 开头”
- swift - 每次调用一个值时创建一个循环以添加 40
- javascript - Jasmine 测试超时并显示“在 5000 毫秒内未调用异步回调”尽管在我的 Angular 项目测试中没有使用异步函数
- javascript - 如果将对象作为参数传递给另一个文件中的函数,原始对象会改变吗?
- java - Thread 对象的 run 方法如何在内部调用 Runnable 对象的 run 方法?
- angular - 在 mat-cell 中使用 ngFor 的正确方法
- microservices - Api 网关如何将响应组合成微服务
- c++ - 如何使用 TouchGFX 在 LCD 屏幕上显示 ADC 值?
- haskell - haskell中的数字转换