我想在我的一个文档中存储一个固定大小的数组。
即。 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个最新报告,然后从最新到最新订单。
我这样做错了吗?
答案 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}}})
它应该有用。