按时间排序的固定大小数组(最新的第一个)

时间:2013-07-22 17:20:47

标签: mongodb

我想在我的一个文档中存储一个固定大小的数组。

即。 users集合包含一系列报告。每个报告都有一个时间戳。我想对数组中的报告进行排序,以便最新的(最新的)位于数组的开头。

我正在尝试使用$ slice方法,但我似乎只能保留数组中的最后N个元素。在我的情况下,我想保留数组中的前N个元素。

有什么方法可以让我以最新的方式保持数组排序,只存储N个最新的报告。这样,当我查询N个最新报告时,我可以从数组的开头抓取。

var newReport = ...;
  db.users.update({{_id: id},$push: {reports: {$each: [newReport], $sort: {"updatedOn": -1}, $slice: -3}}})

这将从最新到最旧排序,但由于切片为负数,因此最旧的3个报告将保留在数组中。

var newReport = ...;
  db.users.update({{_id: id},$push: {reports: {$each: [newReport], $sort: {"updatedOn": 1}, $slice: -3}}})

这将从最旧到最新排序,并且报告列表将保留3个最新报告,然后从最新到最新订单。

我这样做错了吗?

1 个答案:

答案 0 :(得分:1)

您的第二个查询应该主要为您提供所需内容。我同意Amalia的说法,在您的应用程序代码中获得正确的数组顺序会更容易。

但是,第二个查询的语法存在一些问题。更新查询遵循以下模式:

db.users.update({<query>}, {<update>})

现在你正在做

db.users.update({<query, <update>})

如果您将查询更改为

db.users.update({_id: id}, {$push: {reports: {$each: [newReport], $sort: {"updatedOn: 1}, $slice: -3}}})

它应该有用。