我定义了User model
。该模型有两个列表,一个是用户喜欢的项目,另一个是用户不喜欢的项目。
我需要一个用户没有资格(既不喜欢也不讨厌)和其他用户的项目列表。我正在使用Mongoose库用于NodeJS以及lodash(_)库,
我的代码看起来像这样:
function itemsUserHasntQualified(var user){
items = [];
User.find().exec(function(err, users){
for(var user_it: users){
if(user_it != user){
items.push(_.difference(user_it.tracks.liked, user_it.tracks.disliked, user.tracks.liked, user.tracks.disliked);
}
}
});
}
这是User
:
var UserSchema = new Schema({
name: String,
username: {type: String, lowercase:true },
email: { type: String, lowercase: true },
role: {
type: String,
default: 'user'
},
hashedPassword: String,
provider: String,
salt: String,
facebook: {},
twitter: {},
google: {},
github: {},
tracks: {
liked: [{type:Schema.ObjectId, ref: "Track"}],
disliked: [{type:Schema.ObjectId, ref: "Track"}],
later: [{type:Schema.ObjectId, ref: "Track"}]
}
});
但实际上我觉得这不是正确的做法。 是否有更简单或更正确的查询方式?
答案 0 :(得分:0)
我不确定什么归类为正确,但您至少可以在mongodb中运行大量查询而不返回整个集合。
Query#distinct的db.collection.distinct()将返回不同的数组项,并且可以提供查询。
User.distinct('tracks.disliked', { username: { $ne: username } })
User.distinct('tracks.liked', { username: { $ne: username } })
这将为您提供liked
和disliked
的数组,然后您可以为用户区别。
UserSchema.methods.itemsUserHasntQualified = function () {
var user = this
var liked = User.distinct('tracks.liked', { username: { $ne: user.username } })
var disliked = User.distinct('tracks.disliked', { username: { $ne: user.username } })
Promise.all([liked, disliked]).then(function (results) {
var all_ratings = _.union( results[0], results[1] )
var users_ratings = _.union( user.tracks.liked, user.tracks.disliked )
var missing = _.difference( users_ratings, all_ratings )
return missing
})
}
根据您的访问模式,您可能希望在其他地方运行此集合扫描,减少频率并缓存数组结果以便在itemsUserHasntQualified
中使用。