我有一个这样的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
以来,也以“阿凡达”作为她电影爱好的女孩。但是,我希望能够返回具有相同电影兴趣的所有人。有办法吗?
答案 0 :(得分:0)
如果我正确理解了您的问题,则可以使用$ in获取与至少一个值匹配的所有文档,这是一个示例:
db.collection('user').find({
gender: interest,
movie: { $in: movies}
})
答案 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/