Отказ от ответственности : я еще не использовал Mon goose, но в комментариях вы сказали, что запрос mongodb также будет полезен.
На основе схем Mon goose Вы описали, я смоделировал 10 документов для продуктов и 3 для счетов, используя Mockeroo (https://mockaroo.com/). Обратите внимание, что objectId здесь просто воспринимаются как целые числа, но запрос должен работать так же хорошо, если все идентификаторы являются objectIds.
Products :
{
"_id": 1,
"storeId": 1,
"invoiceId": 3,
"unitPrice": 127,
"quantity": 21,
"timestamp": "1558330027"
},
{
"_id": 2,
"storeId": 2,
"invoiceId": 2,
"unitPrice": 140,
"quantity": 25,
"timestamp": "1552293229"
},
{
"_id": 3,
"storeId": 1,
"invoiceId": 2,
"unitPrice": 192,
"quantity": 80,
"timestamp": "1576270154"
}, //and so on...
Счета-фактуры :
{
"_id": 1,
"customer": "Y-find",
"netTotal": 1,
"paid": true,
"type": "stale"
},
{
"_id": 2,
"customer": "Namfix",
"netTotal": 72,
"paid": true,
"type": "sale"
},
{
"_id": 3,
"customer": "Opela",
"netTotal": 67,
"paid": false,
"type": "fail"
}
Поскольку каждый продукт хранит один invoiceId, продукты-счета-фактуры являются отношением многие-к-одному (так как многие продукты могут иметь один и тот же invoiceId и, следовательно, принадлежать Однако в том же счете мы не храним конкретную ссылку на продукты в счетах, и каждый продукт имеет только один счет-фактуру, поэтому один продукт должен принадлежать только одному счету.
Наша цель - написать запрос чтобы получить все продукты, где тип счета-фактуры "продажа". Для этого я написал следующее агрегирование:
db.products.aggregate([
{
$lookup: {
"from": "invoices",
"let": {
inv_id: "$invoiceId"
},
"pipeline": [
{
$match: {
$expr: {
$eq: [
"$$inv_id",
"$_id"
]
}
}
}
],
as: "invoice"
}
},
{
$unwind: {
path: "$invoice"
}
},
{
$match: {
"invoice.type": "sale"
}
},
{
$unset: "invoice"
}
])
Я вставил фиктивные данные в Mongoplayground и опробовал, вот оно: https://mongoplayground.net/p/K8ciQ-Ei12P
Обратите внимание, что последний этап $ unset предназначен только для того, чтобы убедиться, что все документы в результате являются только документами продукта без подробных данных счета-фактуры (так как это было необходимо).
Надеюсь, это помогло. Если у кого-либо есть какие-либо оптимизации, на которые можно указать, или они могут преобразовать их в Mon goose, не стесняйтесь.