2

私はたくさんの研究をしたと言うことから始めますが、それでも私はかなり迷っています。

私は動作するバージョンを持っていますが、これはあなたがこれを行うことができる最も非効率的な方法だと確信しています。私はDBを計画するための最良の方法を知ることに自信がありません。明らかに、ActiveRecordに依存するようになりました。とにかく、私は単にこれらのことを理解しようとしています:

  1. データベースを計画するための最良の方法を見つける(ドキュメントを分離する方法)
  2. 関係に対処するための最も効率的なものを見つける
  3. サーバーからクエリを実行するための適切な方法を見つける

さて、私が気付いたことがいくつかあります。1つは、クライアント変数をビューに渡すことができないため、そのようなメソッドを使用しても機能しないことです。2つ目は、すべての投稿を取得して、タイプがpostであるかどうかを確認し、一致するドキュメントを返すことはできないと思いますが、それは大量のデータが移動しているようです。

いくつかのコード:

そのため、ミドルウェアとしてNode.js、CouchDB、nanoを使用しています。

投稿ドキュメント:

{
"_id": "post-slug",
"title": "Post Slug",
"user": "film42",
"date": 1343451412,
"type": "post"
}

ユーザードキュメント:

{
"_id": "film42",
"email": "test@example.com",
"posts": [
   "post-slug",
   "another-post-slug"
],
"type": "user"
}

そして、これが私が現在すべての投稿を取得する方法です(それは本当に悪いです!):

function buildUserPostArray(array, user, res, i) {
   db.get(user.posts[i], function(err, post_obj) {
       if(i < user.posts.length) {
           array.push(post_obj);
           buildUserPostArray(array, user, res, i+1);
       }
       else {
           console.log('Rendering view now.');
           res.render('user.jade', {
               user: user.user,
               posts: array
           });
       }
   });
}

app.get('/users/:id', function(req, res) {
    db.get(req.params.id, function(err, user_obj) {
       if(err) res.send('err1'); //bad id or server down

       array = [];
       buildUserPostArray(array, user_obj, res, 0);
    });
});

変数を渡すことができないことに気付くまでビューを使用していたので、リストを調べましたが、多くのチュートリアルを読んだ後、迷子になりました。

助けてくれてありがとう!!

4

2 に答える 2

2

あなたは本当にビューを使いたいです。ユーザーをキーとして投稿にビューを作成するだけです。

function(doc) {
    emit(doc.user, {title: doc.title, date: doc.date, id: doc._id});
}

次に、単純にクエリを実行できます。

GET /yourdb/_design/app/_view/by_user?key=film42

これにより、そのユーザーに関連付けられているすべてのビュー ドキュメントが表示されます。

于 2012-07-29T04:24:19.907 に答える
0

Will Hartung が言ったように、ビューが必要ですが、Will が示したものとは少し異なるように見える必要があります。

まず、出力したいフィールドが存在することを確認してください。null0は JavaScript の偽の値であるため、データ構造によっては、フィールドがundefined明示的に指定されているかどうかを確認する必要があることに注意してください。

ここに、私が何を意味するかを示すコードをいくつか示します。

function(doc) {
    if (doc.user && doc.title) { // This check is important
        emit(doc.user, {title: doc.title, date: doc.date});
    }
}

とにかく自動的に行われるため、ドキュメント ID を明示的に発行する必要はありません。また、ドキュメント全体を発行しないようにしてemit(doc.user, doc);ください。それは非効率的です。ドキュメント全体が必要な場合は、null値として発行し、include_docs=trueURL パラメーターを使用します。

したがって、基本的にnull、値として発行すると、次のようなドキュメントが得られます。

GET /yourdb/_design/app/_view/by_user?key=film42&include_docs=true

于 2012-07-29T08:29:06.657 に答える