0

MongoDBに2つのコレクションがあります

ユーザー(find()):

{ "_id" : ObjectId("5021314e372c50859ced7063"), "name" : "Vinícius", "username" : "vinixhenri", "password" : "vinix123" }
{ "_id" : ObjectId("50213180372c50859ced7064"), "name" : "André", "username" : "andre", "password" : "andre123" }

およびプロジェクト(findOne()):

{
    "_id" : ObjectId("50215d09ddf7410905000000"),
    "name" : "Projeto X",
    "local" : "/home/server/compartilhamento/htdocs/project_x/",
    "permissions" : [
            {
                    "user" : "5021314e372c50859ced7063",
                    "alter" : true,
                    "view" : true,
                    "delete" : true,
                    "view_task" : true,
                    "insert_task" : true,
                    "alter_task" : true,
                    "delete_task" : true
            },
            {
                    "user" : "50213180372c50859ced7064",
                    "alter" : true,
                    "view" : true,
                    "delete" : false,
                    "view_task" : false,
                    "insert_task" : false,
                    "alter_task" : false,
                    "delete_task" : false
            }
    ],
    "tasks" : [
            {
                    "responsible" : "5021314e372c50859ced7063",
                    "description" : "Ajuste na barra lateral do site"
            },
            {
                    "responsible" : "5021314e372c50859ced7063",
                    "description" : "Ajuste no cabeçalho do site"
            },
            {
                    "responsible" : "50213180372c50859ced7064",
                    "description" : "Ajuste no rodapé do site"
            }
    ]

}

プロジェクトのfindOne()コレクションを表示しましたが、それもfind()になるのではないかと思います。

料金のユーザー名が「vinixhenri」であるすべてのタスクを取得するにはどうすればよいですか?ユーザーIDはタスク->責任です。

また、_idユーザーを維持するのに正しいことをしているのだろうか?ユーザー情報を調べてから、データベースにプロジェクト情報を再照会する必要があるのは正しいですか?または、コレクション内のユーザーのタスクに関する情報を複製する必要がありますか?

4

1 に答える 1

0

2.2までの最も適切な方法(https://jira.mongodb.org/browse/SERVER-828または集約フレームワーク)は、次のいずれかになります。

  • 1つ以上のタスクを含むすべてのルートドキュメントを返し、特定のユーザーの「料金」でクライアント側でそれらを除外して、そのユーザーに関連付けられたプロジェクト全体で非常にうまく機能する可能性のあるタスクのみを取得します。

  • MR(あまり推奨されません)を実行します。MRは、頻繁に、必要なパーペクティブにドキュメントを再フォーマットします。

注:MRはリアルタイムではありませんが、クライアント側でリアルタイムにフィルタリングすることができます。そのため、私は個人的にこれをクライアント側でフィルターで除外することを選択します。

また、_idユーザーを維持するのに正しいことをしているのだろうか?ユーザー情報を調べてから、データベースにプロジェクト情報を再照会する必要があるのは正しいですか?または、コレクション内のユーザーのタスクに関する情報を複製する必要がありますか?

はい、これは問題なくパフォーマンスが優れています。たとえば、ユーザーがユーザー名を変更したとしましょう。すべてのプロジェクトドキュメントを確認したくない場合は、ユーザー名を変更しますか?すべての情報の更新を取得する外部行を照会する必要があると、費用がかかりますが、メリットもあります。この場合、ユーザーデータをプロジェクトドキュメントに複製するのは良くありません。

于 2012-08-08T13:03:20.503 に答える