私は、ユーザーが彼らに与えたタイトル、本文、および集計評価を含むブログコレクションを持っています。スキーマがブログを参照している別のコレクション「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" } )
マングースでこのクエリを実行するにはどうすればよいですか?