如何使用mongoimport中的ObjectID?

时间:2014-02-22 18:44:30

标签: meteor

我使用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。不幸的是,页面仍然呈现空白,我不确定这是因为我订阅,发布或查找收集项目的方式。

1 个答案:

答案 0 :(得分:2)

总结评论主题作为答案:

只需在id上调用._str

即可获得ObjectID的字符串部分
id._str

您还可以使用

从十六进制字符串中制作ObjectID
new 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的指示和问题