1

「カテゴリ」と「記事」の 2 つのコレクションを含む MongoDb のデータベースがあります。NodeJs で Mongoose を使用してデータベースに接続し、カテゴリを読み取ります。追加のリクエスト/クエリを作成せずにカテゴリの記事数を計算したいので、データベース レベルでこれを解決できれば完璧です。

「カテゴリ」コレクションのアイテムは次のようになります。

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'name': 'Blog posts'
}

「記事」コレクションのアイテムは次のようになります。

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'title': 'Article title',
'published' : '12/09/2012',
...
}

そのため、カテゴリと記事は「feed_id」フィールドを使用してリンクされています。

すべてのカテゴリを対応する数の記事と一緒にエクスポートしたいと思います。

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'name': 'Blog posts',
'no_articles': 4
}

これをどのように正確に行うべきかわかりません:

1)カテゴリ コレクションに「no_articles」フィールドを作成しますか? はいの場合、ドキュメントが記事コレクションに挿入または削除されたときに、これが自動的に更新されるようにしたいと思います。

2)カテゴリが読み取られたときに記事を「no_articles」に合計しますか?

MapReduce とグループについて何か読んだことがありますが、この特定のタスクにそれらを使用できるかどうかはよくわかりませんでした。

4

2 に答える 2

1

これは、従来のリレーショナルデータベースが本当に優れているユースケースの1つです。

mongodbの1つのクエリでそれを行うことは不可能です。あなたが言及した「no_articlesフィールド」は行く方法です。このアプローチの一般的な名前(とにかく、Railsの人々の間で)は次のとおりCounter Cache Columnです。私はマングースにあまり詳しくないので、マングースがあなたのためにその分野を維持するかどうかはわかりません。MongoDB自体は確かにそれを行いません。しかし、それを自分で維持することは多くの作業ではありません。正確である必要があります。

カテゴリを読むときは記事を数えないことをお勧めします。これはN+1 query問題の典型的な例であり、カウンターキャッシュ列はそれを防ぐためにあります。

于 2012-10-03T10:49:48.113 に答える
0

カテゴリを投稿ドキュメントに直接保存しないのはなぜですか? カテゴリを使用する投稿ごとに新しいカテゴリ ドキュメントを作成しているように見えるため (feed_id を使用した 1 対多のリンクによって証明されるように)、投稿ドキュメント内にカテゴリの配列を格納することは理にかなっています。

{
'_id' : ObjectId("..."),
'feed_id' : 1,
'title': 'Article title',
'published' : '12/09/2012',
...
categories : [ 'Blog Posts', 'Category 2' ]
}

次に、次のことができます

db.articles.find({categories : 'Blog Posts' })

特定のカテゴリのすべての記事を検索するには、.count() を追加してカウントを取得できます

これらの feed_id を使用して参加することは、MongoDB にとって忌み嫌われます。複数のコレクションに参加することはできないため、非正規化するか、すべてを 1 つの大きなコレクションに入れる必要があります。Mongo は、すべてを非正規化するように設計されています。

これが問題を解決する正しい方法ではないように思われる場合は、RDBMS を使用する方が適している可能性があります。

于 2012-10-03T21:34:36.500 に答える