Я хочу выполнить поиск в массиве transactions
в поисках определенного совпадения. В этом примере pipedrive_id
.
Это то, что я пробовал (согласно инструкции mongodb и этому другому сообщение о переполнении стека)
const pipedrive_id = 1677;
const inner_pipedrive_id = 1838;
const result = await Transactions.find({
pipedrive_id,
'transactions': { $elemMatch: { 'pipedrive_id': inner_pipedrive_id } }
});
const result2= await Transactions.find({
'transactions': { $elemMatch: { 'pipedrive_id': inner_pipedrive_id } }
});
const result3 = await Transactions.find({
'transactions.pipedrive_id': inner_pipedrive_id
});
И каждая итерация результата возвращает все transaction
элементов (все 6 элементов вместо 2 [именно столько у Марка Смита в массиве).
Как документ, $elemMatch
сопоставляет документы, которые содержат поле массива с критериями хотя бы один элемент, который соответствует.
Чтобы отфильтровать результат внутри массива, вам нужно будет использовать $filter
из агрегации
Ссылка: https://www.mongodb.com/docs/manual/reference/operator/aggregation/filter/
Вы можете использовать агрегат для фильтрации массива. Что-то вроде этого
Вы можете удалить $project
, если хотите все поля
db.collection.aggregate([
{
$match: {
pipedrive_id: "1677"
}
},
{
$unwind: "$transactions"
},
{
$match: {
"transactions.pipedrive_id": "1838"
}
},
{
$project: {
_id: 0,
pipedrive_id: 1,
transactions: 1
}
}
])
Вы можете проверить Детская площадка Монго здесь.