0

埋め込まれたドキュメントの配列を含むモデルがあります。この埋め込まれたドキュメントは、ユーザーが特定のアクティビティで獲得したポイントを追跡します。ユーザーは複数のアクティビティの一部または1つだけになる可能性があるため、これらのアクティビティを配列に保持することは理にかなっています。ここで、特定のアクティビティの上位10人のユーザーである名声の殿堂を抽出したいと思います。現在、私はこのようにやっています:

userModel.find({ "stats.activity": "soccer" }, ["stats", "email"])
.desc("stats.points")
.limit(10)
.run (err, users) ->

(構文について疑問がある場合は、coffeescriptです)

ここで、「stats」は埋め込まれたドキュメント/アクティビティの配列です。

これは実際に機能しますが、現在、アクティビティが1つしかないアカウントでのみテストしています。ユーザーがより多くのアクティビティを実行すると、(ソートに関して)何かがうまくいかないと思います。とにかく、トップレベルのドキュメントと一緒に「activity」==「soccer」である埋め込みドキュメントのみを返すようにmongooseに指示できますか?

ところで、私はそれ自身のコレクションに統計を持ち、関連するユーザーへのdb-refを持っていることによって、これを別の方法で行うことができることを理解していますが、書き換えを検討する前に、このようにそれを行うことが可能かどうか疑問に思っています。

ありがとう!

4

1 に答える 1

1

配列に複数のアクティビティがあると、これは機能しないというのは正しいことです。

具体的には、要素を含む配列の任意のサブセットだけを返すことはできないため、すべてを取得し、「activity」と「ペアになっている」ポイントだけでなく、すべてのポイントに並べ替えが適用されます。 "。

ただし、これを回避するためにスキーマに加えることができる非常に簡単な調整があります。アクティビティ名を値として保存するのではなく、キーとして使用してください。

{ _id: userId,
  email: email,
  stats: [
    {soccer : points},
    {rugby:   points},
    {dance:   points}
  ]
}

これで、次のようにクエリと並べ替えができるようになります。

users.find({"stats.soccer":{$gt:0}}).sort({"stats.soccer":-1})

バージョン2.2(現在は不安定な開発バージョン2.1としてのみ利用可能)に移行すると、集約フレームワークを使用して、変更せずに必要な結果(クエリに一致する配列またはサブドキュメントの特定のサブセットのみ)を取得できることに注意してください。スキーマ。

于 2012-06-04T02:29:48.297 に答える