我使用mongoimport将一堆大型csv文件导入到流星集合中,但是当他们进行插入时,_id值是ObjectID,而meteor使用字符串id。流星文档here中的ObjectIDs有一个小小的模糊,但我真的不明白我应该做什么。例如,使用Iron Router我有一条像这样的路由
this.route('profileView', {
path: '/profiles/:_id',
notFoundTemplate: 'notFound',
fastRender: true,
waitOn: function() {
return [Meteor.subscribe('singleProfile', this.params._id, Meteor.userId())];
},
data: function() {
Session.set('currentProfileId', this.params._id);
return Profiles.findOne({
_id: this.params._id
}, {
fields: {
submitted: 0
}
});
}
但路径的url是object类型,看起来像http://localhost:3000/profiles/ObjectID(%22530845da3621faf06fcb0802%22)
。它也不返回任何内容,页面呈现为空白。这是出版物。
Meteor.publish('singleProfile', function(id, userId) {
return Profiles.find({
_id: id,
userId: userId,
forDel: {
$ne: true
}
});
});
我想我的问题是,我应该如何使用ObjectID,以便路由只使用ObjectID的字符串部分,以及如何正确返回数据?
更新:我已设法通过更改从<a href="{{pathFor 'profileView'}}" class="profile-details">Details</a>
到<a href="/profiles/{{_id._str}}" class="profile-details">Details</a>
的视图链接来从网址中获取ObjectID,因此网址现在为http://localhost:3000/profiles/530845da3621faf06fcb0802
。不幸的是,页面仍然呈现空白,我不确定这是因为我订阅,发布或查找收集项目的方式。
答案 0 :(得分:2)
总结评论主题作为答案:
只需在id上调用._str
即可获得ObjectID的字符串部分id._str
您还可以使用
从十六进制字符串中制作ObjectIDnew Meteor.Colletion.ObjectID(hexstring)
因此,当您使用<a href="/profiles/{{_id._str}}" class="profile-details">Details</a>
访问路线时,您可以制作您的发现:
Profiles.findOne({
_id: new Meteor.Collection.ObjectID(this.params._id)
});
一般来说,使用ObjectID时,你会发现自己需要一些反模式从string转换为objectId,反之亦然,所以像下面这样的实用程序会派上用场:
IDAsString = this._id._str ? this._id._str : this._id
和
IDAsObjectId = this._id._str ? this._id : new Meteor.Collection.ObjectID(this._id)
还请查看github.com/meteor/meteor/issues/1834和groups.google.com/forum/#!topic/meteor-talk/f-ljBdZOwPk,了解有关使用ObjectID的指示和问题的