0

コレクションがあります

city: {"_id", "name"}

company: {"_id", "name", "cityID"}

comments: {"_id", "text", "companyID"}

特定の都市の企業に関する最後の10件のコメントを選択する必要があります。

次に、市内のすべての企業の最初に_idを選択し、次に_idで受け取った10個のコメントを選択します。コードは次のとおりです。

$ db-> execute ('function () {

var result = {};

var company = [];
result.company = [];
db.company.find ({"city": "msk"}, {"title": 1, "_id": 1}). forEach (function (a) {
result.company [a._id] = Object.deepExtend (a, result [a._id]);
company.push (a._id);
});


var comments = [];
result.comments = [];
db.comments.find ({"company": {"$ in": company}}). sort ({"createTime": -1}). limit (10). forEach (function (a) {
result.comments [a._id] = Object.deepExtend (a, result [a._id]);
comments.push (a._id);
});


return result;

} ');

Estiは私が必要なことをするためのより良いオプションですか?よろしくお願いします!

4

1 に答える 1

0

今あなたのコード

db.comments
  .find({"company": {"$in": company}})
  .sort({"createTime": -1})
  .limit(10)

各企業の最後の10件ではなく、指定された都市の全体の最後の10件のコメントのみを取得しています。これは、あなたの望むことですか?その場合は、コメントごとに「都市」フィールドを保存し、都市に基づいてコメントコレクションにクエリを実行するのが理にかなっている場合があります。

現在のスキーマを使用して、会社ごとに10を継続する場合は、関連する会社ごとにコメントコレクションに対して個別のクエリを実行する必要があります。

データのユースケースは何ですか?

編集:

リレーショナルデータベースモデルでは、1つのクエリで両方のテーブル(会社とコメント)から情報を取得するJOINクエリを実行できます。ただし、MongoDBは結合をサポートしていないため、1回のクエリで必要な情報を取得できるようにする場合は、コメントコレクションに都市フィールドを格納してデータを少し非正規化する必要があります。

于 2012-09-21T16:58:49.533 に答える