NoSQLに関しては初心者ですので、MongoDBで学習する過程でヘルプデスクアプリケーションを作成することにしました。さて、データモデルを設計するには、私は次のように私がモデル化したユーザーとチケットを持っています。私が参照して、このに従うことをしようとしているMongoose - 複数のコレクションからの問い合わせ
User
----
|- mid (member id, String)
|- name (user name, String)
|- mail (e-mail, String)
\_ pass (md5 hashed password, String)
、チケットはそれらを作成しても、チケットに返信しているユーザーへのユーザーを参照します。私はそれを次のように構成します:
Ticket
------
|- tid (ticket id, String)
|- title (title of ticket, String)
|- status (status of ticket, String)
|- replies (embedded replies doc, [{ mid: ..., msg: ... }])
|- assignee (whom the topic is assigned to, String, refers to users)
\_ priority (priority level of the ticket, 1-5, Number)
今私はすべての開いたチケットのリストをユーザに表示したいと思います。次のように:これは、今まで十分にシンプルに見えますが、ここでdata
がオープンの配列です
tickets.find({ "status": "open" }, (err, data) =>
{
if (err)
{
console.error(err);
res.json({
"success": false,
"message": "Failure to get from database"
});
}
else
{
// TODO: Convert the "mid" references in the data
}
});
:
| Title | Num Replies | Assignee | Author | Priority |
|------------------------|-------------|----------|--------|----------|
| Unblock this URL | 5 | SHC | ABC | 5 |
| Install MS Office here | 2 | STC | XYZ | 4 |
...
私はオープン、このコードを持つことをすべてのチケットを取得しましたチケットは、author
とassignee
のフィールドをメンバーIDとして使用します。メンバーの名前が必要です。
もちろん、メンバー名を見つけるために別のクエリを実行することもできますが、100個の公開チケットがあると仮定すると、201クエリが得られますが、これはクールではありません。
$in
クエリを使用してDBからユーザーオブジェクトを取得し、すべてのチケットをループして得られた結果を使用してユーザーオブジェクトの配列を作成することで、この問題を最適化しようとしましたこれはわずか2クエリになります。それは動作しますが、どのように適切にアプローチするのか、そして何らかのハックがないことを知りたいのです。 MySQLの背景から来る
は、私は、MySQLでの単一のクエリでこれをやっているだろう:
select t.tid, t.title, t.priority, a1.name, a2.name
from tickets t, users a1, users a2
where a1.mid = t.assignee and
a2.mid = t.author;
私はマングースとMongoDBのクエリでは、この種のアプローチはどうすればよいですか。
ありがとう@Alex、私はpopulateオプションを使用しましたが、仮想スキーマのメンバーがありました。 –