使用Mongoose的MongoDB中的大查询

时间:2016-05-23 20:11:34

标签: node.js mongodb mongoose

我定义了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"}]
  }
});

但实际上我觉得这不是正确的做法。 是否有更简单或更正确的查询方式?

1 个答案:

答案 0 :(得分:0)

我不确定什么归类为正确,但您至少可以在mongodb中运行大量查询而不返回整个集合。

Query#distinctdb.collection.distinct()将返回不同的数组项,并且可以提供查询。

User.distinct('tracks.disliked', { username: { $ne: username } })
User.distinct('tracks.liked', { username: { $ne: username } })

这将为您提供likeddisliked的数组,然后您可以为用户区别。

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中使用。