【问题标题】:Select the last document from mongo collection in meteor从流星中的mongo集合中选择最后一个文档
【发布时间】:2016-02-01 04:56:59
【问题描述】:

我想要查询中的最新文档。下面我将获取名称来自变量“personalFullName”的那些文档,然后按名为“RecordID”的字段对它们进行排序(该字段具有更高的数字作为以后的日期条目),然后抓取最后一个。我想要此查询中的最新(RecordID 编号最大的)条目:

Programs.find({ FullName: personalFullName }, { sort: { RecordID: 1 }, limit: 1}).fetch().pop();

我收到一个错误,它超出了调用堆栈大小。

【问题讨论】:

  • Programs.findOne({ FullName: personalFullName }, { sort: { RecordID: -1}}) 是否适合您?
  • 我无法使用 findOne,因为查询可能返回多个具有该名称的文档。
  • @ŁukaszKapica 你确实为我解决了一个问题。尽管堆栈大小的问题是我的代码中与我的问题无关的问题,并且使用“find()”确实找到了正确的文档,但在执行更新时我不得不使用“findOne”来查找文档,即使有多个具有相同名称的文档必须进行排序。我的印象是,通过使用 findOne(),它首先会停在它找到的第一个文档处,然后对它们进行排序。看起来我的工作正好相反。
  • 一旦你包含了限制过滤器,我就想弄清楚为什么 findOne 或 pop 是必要的。
  • 我在 findOne() 操作之后立即执行 Collection.update({})。虽然我的限制过滤器为 1,但因为我需要通过 _id 进行更新,所以我做了:Collection.update({ _id: foo._id}, {$set: object}),并且“foo._id”是对象符号,所以 foo 需要是一个对象。 findOne() 返回文档本身(一个对象),但 find() 返回一个游标,因此更新失败。我还需要更新排序中倒数第二个文档,限制为 2。在这种情况下,我需要使用 find({...}).fetch().pop() 因为 pop() 与从数组中取出最后一个文档(对象)。

标签: mongodb meteor


【解决方案1】:

如果您习惯使用 meteorhacks:aggregate 包,那么您可以随时使用 mongo 聚合管道发布您想要的项目,可能是这样的(代码是咖啡脚本):

Meteor.publish 'latestPrograms', (personalFullName)->
    return unless personalFullName?
    check personalFullName, String
    pipeline = [
        {$match:{'Fullname': personalFullName}}         
        {$sort: {'RecordID': 1}}
        {$group:{'_id':{Fullname: '$Fullname'}, RecordID:{$last:'$RecordID'}}}
        {$limit:1}
    ]
    @added 'latestPrograms', Random.id(), item for item in programs.aggregate pipeline
    @ready()

然后您可以通过订阅latestPrograms 伪集合来获取数据。下面是一个使用铁路由路由的例子:

Router.route '/home', 
    name: 'home'
    template:'homepage'
    waitOn:->
        Meteor.subscribe 'latestPrograms', personalFullName
    data:->
        {latestPrograms: latestPrograms.find()}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多