私のアプリケーションでは、コメントを保存します。これまで私のモデルは次のようになっていました:1つのモデルのデータを2つに分割した後、どのようにmongooseクエリを書き直すことができますか?
var CommentsSchema = new Schema({
username: {type: String},
display_name: {type: String},
facebook_username: {type: String},
text_content: {type: String},
photo_content_url: {type: String},
hashtags: {type: [String]},
device_id: {type: String},
comment_date: {type: Date, default: Date.now},
friends_only: {type: Boolean, default: false}
}
各コメント - 詳細の保存以外にも、 username
,facebook_username
,device_id
からコメントが追加され、display_name
となる。ブールフラグfriends_only
があり、そのコメントに基づいて、そのコメントがユーザーのFacebookブックの友人または誰にでも見えるかどうかを判断していました。
node.js
/mongoose
の建設すべてのコメントを取得するためのクエリは、このように見えた:ユーザー上記のコードでは
commentsRoutes.post('/friends', function (req, res) {
var friends = req.body.friends;
var publicComments = req.body.publicComments;
var hashtagsInput = req.body.hashtags;
var startDate = req.body.startDate;
var endDate = req.body.endDate;
var query= {};
query.$and = [];
// and condition on start date
if(startDate != undefined) {
var startDate = new Date(req.param('startDate'));
var endDate = new Date(req.param('endDate'));
query.$and.push({"comment_date":{$gte: startDate}});
query.$and.push({"comment_date":{$lte: endDate}});
}
// and condition on hastags
if (hashtagsInput != undefined) {
var hashtags = hashtagsInput.split(",");
query.$and.push({"hashtags":{$in: hashtags}});
}
// creating a OR condition for facebook friends and public flag
var friend_query = {};
friend_query.$or = [];
if (friends != undefined) {
var friendsSplit = friends.split(",");
friend_query.$or.push({"facebook_username":{$in: friendsSplit}});
}
if (publicComments != undefined && publicComments === "true") {
friend_query.$or.push({friends_only: false});
}
//Merging facebook friend condition with other condition with AND operator.
query.$and.push(friend_query);
var finalQuery = Comment.find(query)
彼の友人によって投稿コンテンツをフェッチすることができ(それはパブリックまたはプライベートに設定された)と、すべての他のパブリックコンテンツ(誰からも)。
私はこれをすべて変更し、データを2つのモデルに分割することに決めました。それを変更した後、私は持っている:
var CommentsSchema = new Schema({
user_id: {type: String, required: true, ref: 'users' },
text_content: {type: String},
photo_content_url: {type: String},
hashtags: {type: [String]},
comment_date: {type: Date, default: Date.now},
friends_only: {type: Boolean, default: false},
device_id: {type: String}
}
と
var UsersSchema = new Schema({
username: {type: String},
facebook_username: {type: String},
display_name: {type: String}
}
を今、私は古い機能を維持したいとき、私は、クエリを作成するための責任のコードを変更する必要があります。 2つのクエリを
async
とマージするか、もう1つの方法は
mongoose
.populate
オプションを使用することです。私は2番目の選択肢で行くことにしましたので、今、私は
populate
機能の
match
一部に
or
クエリを作成する責任コードを移動する必要があります。
...
var finalQuery = Comment.find(query)
finalQuery.populate({path: 'user_id',
select: 'facebook_username display_name username',
match: {
}});
私はどのように行うのか分かりません。あなたはそれで私を助けることができますか?
'のuser_id:{タイプ:Schema.Types.ObjectId、参照: 'ユーザー'}、'あなたが – EQuimper
を移入したいおよびREFは同じにする必要がある場合'mongoose.model( 'users'、UserSchema);' – EQuimper
AFAIKでモデルを作成したときに与えた名前です.MongoDBに2つのコレクションがあるときは、 '$ lookup'を使ってJOINを適用する必要があります。 –