【问题标题】:How to show data from mongoDB with ObjectID如何使用 ObjectID 显示来自 mongoDB 的数据
【发布时间】:2014-09-10 09:41:42
【问题描述】:

我有一个用 MongoDb 编写的“后端”应用程序(在数据库中我有 _id: with ObjectId("13f6ea...002"))我使用流星应用程序来显示信息。一切都很好,我用 {{#each}} 显示信息列表。但是当我想用 '_Id' 显示一个元素时,没有任何效果。

我阅读了this issue 并调整了我的代码以获得正确的根目录,但我无法在页面上显示任何内容。我尝试编写模板助手,但没有帮助

数据库记录:

  {
 _id: ObjectId("13f6ea...002"),
 url: "foo",
 title: "bar",
 published: "2014-08-22 03:26:21 UTC",
 image: "foo.jpg",
 summary: "foo ",
 categories: [
   "F",
   "B"
  ],
  ...
  }

路线:

this.route('news', {
path: '/news/:_id',
template: 'news',
waitOn: function () { 
  var id = this._id; 
  Meteor.subscribe('news', id);
},
data: function() {
  var id = this.params._id;
  return News.findOne({ _id: Meteor.Collection.ObjectID(this.params._id)});
},
 action : function () {this.render();},
});

发布

Meteor.publish('news', function(id) {
  return News.find({_id: id}); 
});

重定向到唯一帖子的模板

<h4><a href="{{pathFor 'news' _id=this._id.toHexString}}">{{title}}</a></h4>

而模板只是 {{news}}

我该如何解决这个问题?


更新

我的解决方案:

路由器.js

waitOn: function () {
  var id = this._id;
  Meteor.subscribe('News', id);
},
data: function() {
  return News.findOne(new Meteor.Collection.ObjectID(this.params._id));
},

在模板中

&lt;a href="news/{{_id._str}}"&gt;

【问题讨论】:

    标签: mongodb meteor iron-router objectid


    【解决方案1】:

    在浏览器中导航到相应的网址(即localhost:3000/news/[_id]),打开控制台并输入:

    Router.current().data()
    

    这将向您显示当前路线的数据上下文。要么什么都不返回,在这种情况下,您的 News.findOne 查询存在根本问题,因为它什么都不返回,或者(更有可能)它返回所需的文档。

    在后一种情况下,据我所知,该文档中没有 news 属性,这就是它没有呈现任何内容的原因。如果您将{{news}} 更改为{{url}}{{summary}},我想它会呈现请求的属性。

    如果通过{{news}},您尝试渲染整个文档,那么(除了它将渲染为[Object] 之类的东西)您需要将news 作为您返回的对象的属性数据函数:

    return {
        news: News.findOne({ _id: Meteor.Collection.ObjectID(this.params._id)});
    };
    

    【讨论】:

    • 谢谢,你的回答是对的,我得到'未定义'。但无法理解我的 .findOne 出了什么问题
    • 如果您只是从控制台运行相同的findOne 查询,您会得到结果吗?如果您在路由控制器中定义了 data 属性(如果有的话),我认为这将覆盖路由本身中设置的上下文,但是如果您的查询在控制台中运行时没有返回任何内容,那么这就是你的问题是。
    • 我得到TypeError: this.params is undefined 我在我的路线中有waitOn(不确定是否需要)和数据功能,就像我上面写的那样。
    • 对不起,我的意思是相同的查询而不是相同的代码; this.params 将在控制台中未定义,因为它在路由定义之外。您需要运行News.findOne({ _id: Meteor.Collection.ObjectID('[IDSTRING]')}),使用您在URL 中提供的任何ID 替换[IDSTRING]
    • 它对我不起作用,我试过 Meteor.Collection.ObjectID('[IDSTRING]'._str)}) 但没有帮助
    【解决方案2】:

    使用 _id 获取文档: 在 events 下的 .js 文件中,Say on click event 和 Collection EventList :-

        'Submit form' : function () {
            var id = this._id;      
            return EventList.find({_id : id}).fetch();
        }
    

    这将返回 id 的对象。在我的案例中,我正在为 Collection 中的所有文档显示一个字段。用户选择一条记录并单击提交,这将获取所有文档字段并显示给用户

    【讨论】:

      猜你喜欢
      • 2017-07-24
      • 1970-01-01
      • 2019-03-31
      • 2014-03-21
      • 1970-01-01
      • 2016-09-08
      • 2023-03-24
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多