0

ドキュメントの 1 つに固定サイズの配列を格納したいと考えています。

IE ユーザー コレクションには一連のレポートがあります。各レポートにはタイムスタンプがあります。最新 (最新) が配列の先頭になるように、配列内のレポートを並べ替えたいと思います。

$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 つのレポートが保持され、古いものから新しいものへと並べ替えられます。

私はこれを間違っていますか?

4

1 に答える 1

1

2 番目のクエリでは、探しているものがほとんど得られるはずです。アプリケーションコードで配列の正しい順序を取得する方が簡単だという Amalia に同意します。

ただし、2 番目のクエリの構文にはいくつかの問題があります。更新クエリは次のパターンに従います。

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

今あなたがやっている

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

クエリを次のように変更した場合

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

それはうまくいくはずです。

于 2013-09-20T14:46:07.547 に答える