1

メインの「タイプ」に関連するいくつかの異なるドキュメント「タイプ」を持つcouchDBデータベースがあります。

一般的なブログ/投稿の例では、主なタイプはブログ投稿であり、その他はコメントです(ただし、コメントには3つの異なるタイプがあります。

すべてのタイプに日付がありますが、ブログの投稿を日付で並べ替えたいのですが、コメントからもすべてのデータを返します。私は次のようなキーを生成するemitを書くことができます:

[date, postID, docTypeNumber]

ここで、docTypeNumberは投稿の場合は1、さまざまなコメントドキュメントタイプの場合は>1です。

例えば:

["2013-03-01", 101, 1]
[null, 101, 2]
[null, 101, 2]
[null, 101, 3]
["2013-03-02", 101, 1]
[null, 102, 2]
[null, 102, 3]

もちろん、これを発行すると、すべてのnullが一緒にソートされます。nullを無視し、配列内のseccond項目でグループ化する方法はありますが、nullでない場合は、最初の項目で並べ替えますか?

または、並べ替えを機能させるために、投稿日を記録するためにすべてのドキュメントを取得する必要がありますか?

私はリストを使いたくありません。リストは遅すぎて、潜在的に大きなデータセットを扱っています。

4

2 に答える 2

1

これを行うには、map 関数で条件を使用します。

if(date != null) {
  emit([date, postID, docTypeNumber]);
}
else {
  emit([postID, docTypeNumber]);
}

配列の長さを可変にするかどうかはわかりません。そうでない場合は、最初にソート変数を追加できます。次のスニペットは、date と postID が同じ値になることはおそらくないため、機能します。

if(date != null) {
  sortValue = date;
}
else {
  sortValue = postID;
}
emit(sortValue, date, postID, docTypeNumber);

更新:これについてもう少し考えました。一般に、実行したいクエリに基づいてビューを作成します。そこで、何を照会する必要があるかを自問します。あなたの場合、ここに 2 つの異なるクエリがあるようです。もしそうなら、私は2つの異なる見解を持つことをお勧めします。ビューを 1 つではなく 2 つ実行することになるため、パフォーマンスが低下しますが、それがユーザーに認識されるかどうかは疑問です。また、より多くのディスク領域を占有する可能性があります。あなたにとっての利点は、より明確で明示的なコードです。

于 2013-03-06T23:49:56.150 に答える
1

すべてのデータ (投稿とコメントの両方) を投稿の日付で並べ替えたいようです。あなたの設計では、コメント ドキュメントには投稿日が含まれていないため (コメント日のみ)、ビューの照合パターンでは困難です。データベースの設計を変更して、ブログ投稿 ID を意味のあるものにし、日付を含めることをお勧めします。日付と著者 ID の連結。このように[doc._id, doc.type]して、投稿と[doc.post, doc.type]コメント ドキュメントから発行すると、投稿とコメントがグループ化され、日付で並べ替えられます。

于 2013-03-07T10:40:30.367 に答える