Использование $ nin во встроенном документе

#node.js #mongodb #mongoose #mongodb-query

#node.js #mongodb #мангуст #mongodb-запрос

Вопрос:

У меня есть подобная схема в MongoDB:

 var Customers = new Schema({
    name: { type: String, trim: true, index: true, default: null, sparse: true },
    facebookId: { type: String, default: null, trim: true, index: true },
    friends: [friends]
});

var friends = new Schema({
    customer: { type: Schema.ObjectId, ref: 'Customers', required: true },
    lastGame: { type: Schema.ObjectId, ref: 'games', required: true, default: null },
    lastGameTime: { type: Date, default: null }
});
  

Теперь в массиве friends у меня есть ссылки на всех клиентов, которые являются Facebook-друзьями конкретного клиента.

Теперь то, что я хочу сделать, это у меня есть экран, на котором я хочу показать всех клиентов, но там я не хочу видеть тех клиентов, которые уже являются моими друзьями Facebook, т. Е. Для примера давайте предположим, что у меня всего 10 клиентов от 1 до 10, я клиент № 4, у которого есть клиент 1,3,5,6 в массиве друзей, поэтому мой результат на экране должен быть для пользователя 2,7,8,9,10

Я буду действительно благодарен, если кто-нибудь сможет подсказать мне путь к этому материалу, используя запрос MongoDB. Я искал и нашел $nin использование, но это работает в простом массиве. Я не понимаю, как я могу реализовать этот запрос во встроенном документе, как в моем случае.

Ответ №1:

Посмотрите на $ elemMatch. Это позволит вам идентифицировать конкретный документ во встроенном массиве документов

elemMatch документация MongoDB

Вы также можете использовать $elemMatch в сочетании с $ nin

Ответ №2:

Я решил эту проблему, используя $ nin с помощью простого подхода: сначала я выбираю всех друзей конкретного клиента в массиве, затем, используя $ nin, я отфильтровал всех друзей из запроса и получил свой результат.