2016-12-18 9 views
1

私のアプリケーションでは、コメントを保存します。これまで私のモデルは次のようになっていました: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: { 

}}); 

私はどのように行うのか分かりません。あなたはそれで私を助けることができますか?

+0

'のuser_id:{タイプ:Schema.Types.ObjectId、参照: 'ユーザー'}、'あなたが – EQuimper

+0

を移入したいおよびREFは同じにする必要がある場合'mongoose.model( 'users'、UserSchema);' – EQuimper

+0

AFAIKでモデルを作成したときに与えた名前です.MongoDBに2つのコレクションがあるときは、 '$ lookup'を使ってJOINを適用する必要があります。 –

答えて

0

最初に、人口統計が2つのクエリを実行してそれらの結果をマージする必要があるデータを提供しないと思う場合、人口照会を使用することをお勧めします。

人口のために、私はmongooseの公式文書から解決策を見つけました。あなたはこのようにすることができます。ここ

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 

var personSchema = Schema({ 
    _id  : Number, 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] 
}); 

var storySchema = Schema({ 
    _creator : { type: Number, ref: 'Person' }, 
    title : String, 
    fans  : [{ type: Number, ref: 'Person' }] 
}); 

var Story = mongoose.model('Story', storySchema); 
var Person = mongoose.model('Person', personSchema); 

Story 
.findOne({ title: 'Once upon a timex.' }) 
.populate('_creator') 
.exec(function (err, story) { 
    if (err) return handleError(err); 
    console.log('The creator is %s', story._creator.name); 
    // prints "The creator is Aaron" 
}); 

は、docのリンクです:http://mongoosejs.com/docs/populate.html

関連する問題