#javascript #mongodb
Вопрос:
У меня есть эти документы
User A: {_id: xxxx, id: A, contacts: ['B', 'C'] }
User B: { _id: xxxx, id: B, contacts: ['A', 'D'] }
User C: { _id: xxxx, id: C, contacts: ['D'] }
User D: { _id: xxxx, id: D, contacts: ['A', 'B'] }
Мой текущий код:
User.find({contacts: { $in: ['A', 'B']}}, { _id: 0, id: 1, contacts: 1})
Результат этого:
[{
_id: xxxx,
id: A,
contacts: ['B', 'C']
},{
_id: xxxx,
id: B,
contacts: ['A', 'D']
},{
_id: xxxx,
id: D,
contacts: ['A', 'B']
}]
Ожидаемый результат: (Я просто хочу, чтобы контакты свойств фильтровались по массиву запросов —> в данном случае [A, B])
[{
_id: xxxx,
id: A,
contacts: ['B']
},{
_id: xxxx,
id: B,
contacts: ['A']
},{
_id: xxxx,
id: D,
contacts: ['A', 'B']
}]
Я пробовал с агрегацией с тем же результатом.
Заранее большое вам спасибо.
Ответ №1:
попробуйте операторы проекции агрегации, начиная с MongoDB 4.4,
$filter
для повторения циклаcontacts
массива и фильтрации в соответствии с входным массивом
db.collection.find({ contacts: { $in: ["A", "B"] } },
{
_id: 0,
id: 1,
contacts: {
$filter: {
input: "$contacts",
cond: { $in: ["$this", ["A", "B"]] }
}
}
})