Подбор людей на основе определенных элементов во вложенном массиве - PullRequest
0 голосов
/ 08 мая 2019

У меня есть такая коллекция MongoDB:

_id: ObjectId("5cb089e459552d8b8cc6a9e4")
username: "admin"
password: "12345"
gender: "male"
interestedIn: "female"
movie: Array
  0: Object
    id: "Avatar"
    title: "Avatar"
    poster: "~"
  1: Object
    id: "Titanic"
    title: "Titanic"
    poster: "~"

У меня есть еще два человека (женщины), такие как «Аватар», а другой «Титаник» в своих фильмах.Теперь я хочу подбирать людей по признаку пола, который их интересует, и когда они разделяют интерес к фильму.Для этого я попытался использовать следующую функцию:

function matches(req, res) {
    db.collection('user').find({ 'username': req.session.user.username })
      .toArray(function(err, data) {
        if (err) {
            console.log('An error has occurred', err);
        } else {
            let interest = data[0].interestedIn;
            let movies = data[0].movie;

            db.collection('user').find({
                gender: interest,
                movie: { $elemMatch: { id: 'Avatar' }}
            }).toArray(function(err, data) {
                res.render('matches.pug', {
                    data,
                    user: req.session.user,
                    interest,
                    movies
                });
            });
        }
    });
}

Когда я запускаю этот код, я получаю только одну девушку, у которой также есть "Аватар" в качестве интереса к фильму, так как я написал id: 'Avatar' на$elemMatch.Тем не менее, я хочу иметь возможность вернуть всех людей, которые разделяют интерес к фильму.Есть ли способ, которым я мог бы сделать это?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Оператор "$ in" должен решить вашу проблему.Вы можете использовать что-то вроде:

db.collection('user').find({
    gender: interest,
    movie: { $in: movies}
})

Другой совет, вы можете сопоставить несколько элементов из массива.$ in вернет вам запись, если хотя бы одно совпадение будет найдено в «movie» из передаваемого вами массива «movies».

Если вы хотите получить документ только тогда, когда все фильмы в ""Массив movie "присутствует в" movie ", используйте" $ all ".

[Ссылка: документация MongoDB] [1]: https://docs.mongodb.com/manual/reference/operator/query/in/

0 голосов
/ 08 мая 2019

Если я правильно понял ваш вопрос, вы можете использовать $ in, чтобы получить все документы, которые соответствуют хотя бы одному из значений, вот пример:

      db.collection('user').find({
        gender: interest,
        movie: { $in: movies}
    })

Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...