mongodb:一个查询问题

时间:2016-01-08 17:01:06

标签: node.js mongodb

我正在设计一个MEAN(MongoDb + Express.js + Angular.js + Node.js)应用程序。

应用程序参与者是用户和个人;目前有大约1000人和约100名用户。

用户是应用程序注册用户,并且这些人是用户需要被通知的外部人员。

每位用户都可以评价和记录她感兴趣的任何人。

我计划的数据库模式是:

var person = new mongoose.Schema({
  name: String,
  phone: String,
  ...
};

var user = new mongoose.Schema({
  name: String,
  email: String,
  ...
},

var userToPersonSchema = new mongoose.Schema({
  userId: { type: ObjectId , required: true },
  personId: { type: ObjectId, required: true },
  rating: Number,
  notes: String,
  ...
});

这是我打算为某人添加用户评分的查询:

db.userToPerson.insert({
  userId: currentUserId,
  personId: currentPersonId,
  rating: 10,
  notes: 'my preferred person!'
});

这是我必须找到所有具有用户评分的人的代码:

var currentUserId = '123...';
var personsAll = db.person.find();
var usersToPersonsAll = db.userToPerson.find({ _id: currentUserId });
var personsRatedByCurrentUser = [];
for (var p = 0; p < personsAll.length; p++) {
  for (var u = 0; u < usersToPersonsAll.length; u++) {
    if (personsAll[p]._id === usersToPersonsAll[u].personId) {
      personsRatedByCurrentUser.push(personsAll[p]);
    }
  }
}

问题:
对于最后的&#34;查询&#34;我想我最好使用某种形式的aggregation,但我找不到任何...... 当然,欢迎任何有关架构设计修改的建议......

1 个答案:

答案 0 :(得分:1)

每当我需要在MongoDB中加入时,我都会将问题分解为两个查询。

首先,使用distinct从第一个集合中获取id。 Distinct只返回一组唯一值。

然后,在第二个集合中查询与这些ID相对应的文档。 $ in参数可以方便地获取数组。

var currentUserId = '123...';
var personIds = db.userToPerson.distinct("personId", { _id: currentUserId });
var personsRatedByCurrentUser = db.person.find({ _id: {$in, personIds}});