根据嵌套数组中的特定元素匹配人员

时间:2019-05-08 10:53:12

标签: javascript node.js mongodb express

我有一个这样的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 :(得分:0)

如果我正确理解了您的问题,则可以使用$ in获取与至少一个值匹配的所有文档,这是一个示例:

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

Fiddle

答案 1 :(得分:0)

“ $ in”运算符应该可以解决您的问题。 您可以使用类似这样的内容:

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

另一个提示,您可以匹配数组中的多个元素。如果在您传递的“电影”数组中的“电影”中找到至少一个匹配项,则$ in将返回记录。

如果仅当“电影”数组中的所有电影都存在于“电影”中时才想获取文档,请使用“ $ all”。

[参考:MongoDB文档] [1]:https://docs.mongodb.com/manual/reference/operator/query/in/