7

私は、ユーザーが彼らに与えたタイトル、本文、および集計評価を含むブログコレクションを持っています。スキーマがブログを参照している別のコレクション「Ratings」、ObjectIdsの形式でブログを評価したユーザー(+1または-1)。

特定のユーザーが「最新の最初の」順序でブログを閲覧する場合(たとえば、ページごとに40個。これらをblogs[0]toの配列と呼びますblogs[39])、この特定のユーザーと、もしあればそれらの40個のブログに関連する評価ドキュメントを取得する必要があります。それらを評価し、彼がそれらのブログに与えた評価を彼に通知します。

ブログ参照objectIdsが間blogs[0]._idにありblogs[39]._id、私の場合は空のリストを返す特定のユーザーのすべての評価ドキュメントを抽出しようとしました。$ltクエリを使用してobjectIdsを比較できない可能性があり$gtます。その場合、どうすればよいですか?このシナリオに合うようにスキーマを再設計する必要がありますか?

この場合、mongoosejsドライバーを使用しています。実行が少し異なるコードの関連部分は次のとおりですが、あなたはその考えを理解しています。

スキーマ:

Client= new mongoose.Schema({
    ip:String
})

Rates = new mongoose.Schema({
    client:ObjectId,
    newsid:ObjectId,
    rate:Number
})

News = new mongoose.Schema({
  title: String,
  body: String,
  likes:{type:Number,default:0},
  dislikes:{type:Number,default:0},
  created:Date,
  // tag:String,
  client:ObjectId,
  tag:String,
  ff:{type:Number,default:20}
});

モデル:

var newsm=mongoose.model('News', News);
var clientm=mongoose.model('Client', Client);
var ratesm=mongoose.model('Rates', Rates);

論理:

newsm.find({tag:tag[req.params.tag_id]},[],{ sort:{created:-1},limit: buffer+1 },function(err,news){

ratesm.find({client:client._id,newsid:{$lte:news[0]._id,$gte:news.slice(-1)[0]._id}},function(err,ratings){
 })
})

編集:以下のスキーマを実装している間、私はmongoose.jsでこのクエリを実行する必要がありました

> db.blogposts.findOne()
{ title : "My First Post", author: "Jane",
  comments : [{ by: "Abe", text: "First" },
              { by : "Ada", text : "Good post" } ]
}
> db.blogposts.find( { "comments.by" : "Ada" } )

マングースでこのクエリを実行するにはどうすればよいですか?

4

1 に答える 1

3

MongoDB(およびその他の非リレーショナルデータストア)の良い習慣は、アプリケーションで簡単に使用/クエリできるようにデータをモデル化することです。あなたの場合、構造を少し非正規化し、評価をブログコレクションに正しく保存することを検討するかもしれません。そのため、ブログは次のようになります。

{
  title: "My New Post",
  body: "Here's my new post. It is great. ...",
  likes: 20,
  dislikes: 5,
  ...
  rates: [
    { client_id: (id of client), rate: 5 },
    { client_id: (id of another client), rate: 3 },
    { client_id: (id of a third client), rate: 10 }
  ]
}

配列内のオブジェクトにはrates、ブログエントリを表示するために必要なすべてのデータが含まれており、評価が1つのドキュメントに含まれているという考え方です。別の方法でレートをクエリする必要があり(たとえば、ユーザーXによるすべての評価を検索する)、サイトの読み取りが多い場合は、現在行っているようにデータをコレクションに保存することも検討してください。Rates確かに、データは2つの場所にあり、更新するのは難しいですが、アプリとそれがデータにアクセスする方法を分析した後は、全体的な勝利になる可能性があります。

ドキュメントの構造の奥深くにインデックスを適用できることに注意してください。たとえば、インデックスを作成すると、特定のユーザーが評価News.rates.client_idしたコレクション内のドキュメントをすばやく見つけることができます。News

于 2012-05-18T07:10:13.813 に答える