我是MEAN堆栈的新手,我遇到了如何从我的javascript正确链接ObjectId与MongoDB的问题。我还试图获得与我在视图中显示的ObjectId对应的名称。
代码用于在日程安排中进行约会,其中用户与每个约会相关联,然后视图显示有关每个约会的信息(即每个用户的姓名)。
以下是我的附表架构:
'use strict';
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ScheduleSchema = new Schema({
description: String,
category: [String],
location: String,
startDate: { type: Date, default: Date.now },
endDate: { type: Date, default: Date.now },
participants: [{
type: Schema.Types.ObjectId,
ref: 'User'
}],
author: {
type: Schema.Types.ObjectId,
ref: 'User'
},
timestamp: { type: Date, default: Date.now },
active: Boolean
});
module.exports = mongoose.model('Schedule', ScheduleSchema);
用户的架构:
var UserSchema = new Schema({
name: String,
email: { type: String, lowercase: true },
role: {
type: String,
default: 'user'
},
hashedPassword: String,
provider: String,
salt: String
});
这个^文件还有很多,但我认为架构是唯一相关的部分。
这是我的控制器代码,通过2个真实用户对象(参与者)传递假测试信息:
// Use our rest api to post a new meeting
$scope.addMeeting = function() {
$http.post('/api/schedules', { description: "Testing schedule adding", participants: ["547f03befccbd4f93874b547", "5481dcbf5dad7f735a766ad9"], category: "1", location: "Small Conference Room", startDate: new Date(), endDate: new Date(), timestamp: new Date(), active: true });
};
我已经得到了很好的发布,但是当我从日程表中获得所有约会并将它们放在视图上时,(显然可能)显示的是ObjectId而不是名称,所以这个:
<table style="width:100%;">
<tr>
<td class="left" ng-class="'head'">Time</td>
<td ng-class="'head'">Attendees</td>
<td ng-class="'head'">Description</td>
<td class="right" ng-class="'head'">Location</td>
</tr>
<tr ng-repeat="meeting in meetings">
<td class="left" ng-class-even="'even'">{{ meeting.startDate | date:"h:mma" }} - {{ meeting.endDate | date:"h:mma" }}</td>
<td ng-class-even="'even'"><span ng-repeat="person in meeting.participants">{{ person }}<span ng-hide="$last">, </span></span></td>
<td ng-class-even="'even'">{{ meeting.description }}</td>
<td class="right" ng-class-even="'even'">{{ meeting.location }}</td>
</tr>
</table>
变成这样:(我发布了一张图片,但我没有足够的声望点,所以所有图片都是“参与者”列下面的用户的ObjectIds而不是名字)
我想知道你应该如何正确地链接东西,以便能够显示名称而不是那些ObjectIds。
对小说感到抱歉,希望我说得足够清楚。
答案 0 :(得分:0)
当您使用Mongoose时,请使用populate
加载关系。在MongoDB中,您将user._id
存储在schedule.participants
中,因此当您列出计划或查询确切的计划时,请确保填充schedule.participants
数组。
http://mongoosejs.com/docs/populate.html
示例
Schedule
.findOne({ title: 'Once upon a timex.' })
.populate('participants')
.exec(function (err, story) {
if (err) return handleError(err);
console.log('The creator is %s', story._creator.name);
// prints "The creator is Aaron"
})
此外,角度代码还应根据需要绑定到用户的姓名或电子邮件。
{{ person.name }}