我正在设计一个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
,但我找不到任何......
当然,欢迎任何有关架构设计修改的建议......
答案 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}});