Так что, если я правильно понимаю, я думаю, что этот запрос может помочь ...
db.records.aggregate(
[
{ $group: {
_id: {customer_id: "$customer_id", document_identifier: "$document_identifier"},
max_updated_at: { $max: "$updated_at" }
}}
])
идея состоит в том, чтобы сгруппировать по двум полям, customer_id
и document_identifier
. Для этого комбо выведите максимум updated_at
, который, как ожидается, будет скользящим целым числом.
Для набора данных, который вы предоставили, мои результаты показывают ...
{ "_id" : { "customer_id" : "123", "document_identifier" : "def" }, "max_updated_at" : 10003 }
{ "_id" : { "customer_id" : "999", "document_identifier" : "xyz" }, "max_updated_at" : 1004 }
{ "_id" : { "customer_id" : "123", "document_identifier" : "abc" }, "max_updated_at" : 1005 }
Формат вывода отличаетсяиз вашего примера. Это нормально, или вам требуется, чтобы формат выходных данных соответствовал вашим примерам?
Редактировать: Таким образом, ОП запрашивает формат выходных данных, соответствующий ожидаемому формату, описанному в вопросе. Без лишних слов ...
db.records.aggregate(
[
{ $group: {
_id: {customer_id: "$customer_id", document_identifier: "$document_identifier"},
max_updated_at: { $max: "$updated_at" }
}},
{ $project: {
_id: 0,
document_identifier: "$_id.document_identifier",
updated_at: "$max_updated_at",
customer_id: "$_id.customer_id"
}}
]
)
Теперь вывод выглядит следующим образом:
{ "document_identifier" : "def", "updated_at" : 10003, "customer_id" : "123" }
{ "document_identifier" : "xyz", "updated_at" : 1004, "customer_id" : "999" }
{ "document_identifier" : "abc", "updated_at" : 1005, "customer_id" : "123" }
Редактировать номер 2:
ОК, так чтоOP имеет гораздо больше полей, чем представлено в вопросе, и хотел бы видеть все поля для соответствующих документов. Вот запрос на данный момент ...
db.records.aggregate(
[
{ $match: { customer_id: "123" }},
{ $group: {
_id: {customer_id: "$customer_id", document_identifier: "$document_identifier"},
max_updated_at: { $max: "$updated_at" }
}},
{ $lookup: {
from: "records",
let: {
customer_id: "$_id.customer_id",
document_identifier: "$_id.document_identifier",
max_updated_at: "$max_updated_at"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: [ "$customer_id", "$$customer_id"] },
{ $eq: [ "$document_identifier", "$$document_identifier"] },
{ $eq: [ "$updated_at", "$$max_updated_at"] }
]
}
}
}
],
as: "result"
}},
{ $unwind: "$result" } ,
{ $replaceRoot: { newRoot: "$result" } }
]
)
Теперь это сначала совпадает с идентификатором клиента. Затем он выполняет самостоятельное соединение, используя $ lookup, а затем $ replaceRoot, чтобы показать только исходные документы. При этом сохраняется исходный формат документа независимо от количества полей.
Вывод:
{ "_id" : ObjectId("5db07a5d3cf0c979dd020f85"), "document_identifier" : "def", "updated_at" : 10003, "customer_id" : "123" }
{ "_id" : ObjectId("5db07a5d3cf0c979dd020f87"), "document_identifier" : "abc", "updated_at" : 1005, "customer_id" : "123" }