MongoDB获取最后插入的文档。

3

这段Meteor代码试图找到集合中的最后一个文档。

.find({userId: this.userId}, {sort: {createdAt: -1}, limit: 1});

但是由于所有文档都按时间顺序排列,我想删除createdAt字段,这样一旦删除,是否有一种“不昂贵”的方式只返回最后输入的文档?谢谢。

{userId: 'someId', info: 'someInfo'}
myCol.findLast().info;              <--- my wish list

$last(aggregation)在文档中首先进行排序等操作。

编辑
尝试利用Stephen Woods提供的想法;

server.js

MyCol._ensureIndex({createdAt: -1});
MyCol.before.insert(function (userId, doc) {
  doc.userId = userId;
  createdAt = Date.now();
});
Meteor.publish('myCol', function () {
  return MyCol.findOne({userId: this.userId});
});

2
相同的排序限制,但使用 _id{sort: {_id: -1}, limit: 1}。这是一个唯一索引,所以应该很便宜。 - Alex Blex
_id 没有按照时间顺序排序。同时您可以使用 $sort 进行 .findOne() - Michel Floyd
@MichelFloyd 但它确实是单调递增的,因为它从TS的4字节值开始,以3字节计数器结束,每秒钟初始随机值都会改变。请注意,按Id排序使用实际值,而不是结果集中显示的字符串表示。实际上,正是ObjectIds单调递增的事实使它们成为一个糟糕的分片键,如果没有哈希处理的话。 - Markus W Mahlberg
1
我刚刚尝试了一下现有的集合,并验证了按 _id 排序时 _id 的顺序根本不匹配 createdDate - Michel Floyd
1
@MarkusWMahlberg - 或许你在想 MongoDB 原生的 ObjectId。Meteor 使用随机包生成包含字母数字的 _id - Michel Floyd
显示剩余4条评论
1个回答

2
我将假设你所说的“昂贵”是指执行时间。在这种情况下,您需要一个createdAt字段,一个createdAt的二级索引,并使用findOne()语句。要为您的集合创建createdAt索引,请执行以下操作:
myCol._ensureIndex({ createdAt: -1 });

然后在你的发布中:
Meteor.publish('myCol', function () {
  return MyCol.find({userId: this.userId}, { sort: { createdAt: -1 } });
});

我尝试了你的建议,但我需要帮助规范语法。请查看我的编辑。谢谢。 - Fred J.
一定要为键建立索引! - Michel Floyd
@FredJ. 你可以按照你所描述的方式,扩展Meteor collections以支持自己的方法。请参阅https://dweldon.silvrback.com/models。 - Michel Floyd
1
@StephenWoods 的发布必须返回游标或游标数组。 - Michel Floyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接