在 MongoDB 中存储和返回 ObjectId(MEAN 堆栈)
Posted
技术标签:
【中文标题】在 MongoDB 中存储和返回 ObjectId(MEAN 堆栈)【英文标题】:Storing and Returning an ObjectId in MongoDB (MEAN Stack) 【发布时间】:2015-02-06 12:02:54 【问题描述】:我是 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 个真实用户对象 ID(参与者)传递虚假测试信息:
// 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>
变成这样:(我发布了一张图片,但我没有足够的声望点,所以显示的所有图片都是“参与者”列下方的用户的 ObjectId,而不是名称)
我想知道您应该如何正确链接事物才能显示名称而不是那些 ObjectId。
对不起小说,希望我说得足够清楚。
【问题讨论】:
【参考方案1】:当您使用 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"
)
Angular 代码还应根据需要绑定到用户的姓名或电子邮件。
person.name
【讨论】:
好的,这有很大帮助——我想我看错了方向。你知道我会把示例代码放在我的项目中的什么地方吗?即使只是一般?我正在尝试保留 Yeoman 'angular-fullstack' 生成器附带的结构......现在正在寻找链接 项目结构在页面底部附近:npmjs.org/package/generator-angular-fullstack 如果这个问题过于宽泛,请不要担心 - 感谢您的快速帮助!以上是关于在 MongoDB 中存储和返回 ObjectId(MEAN 堆栈)的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB - 有没有更好的方法来存储 ObjectID 列表?
MongoDB - 有没有更好的方法来存储 ObjectID 列表?