Как я могу получить проекцию свойства, отфильтрованную по тому же запросу, который используется в операторе $in в MongoDB, используя JavaScript?

#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"]] }
    }
  }
})
 

Игровая площадка