2016-10-15 3 views
0

ユーザーはnode.jsアプリにコンテンツを投稿すると、start_date、facebookのユーザー名、テキストの内容とフラグ、コンテンツを全員に公開するのか、自分のFacebookブックの友達に公開するのかの4つの要素を設定します。私のmongodb/mongooseクエリ条件は自分自身を除外します。それを修正するのを助けることができますか?

ユーザーがコンテンツを取得すると、他のユーザーの公開コンテンツとFacebookの友だちのコンテンツ(友だちのみのコンテンツを投稿した場合でも)を取得できます。

このシナリオで正しく動作するmongooseクエリを作成しました。私はこのようにそれを行う:

だけ彼の友人からのコンテンツに対するユーザーのクエリが(それはプライベートまたはパブリックかもしれません)上記のそのコード、と
var query = Test.find({}) 

if(startDate != undefined) { 
    var startDate = new Date(req.param('startDate')); 
    query = query.where('updated_at').gte(startDate); 
} 

if (friends != undefined) { 
     var friendsSplitted = friends.split(","); 
    for(var i=0; i<friendsSplitted.length; i++) { 
     query = query.or([{ 'facebook_username': friendsSplitted[i] }]); 
    } 
} 

query = query.where('hidden').equals(false); 

if (publicFlag != undefined && publicFlag === "true") { 
    query = query.or({friends_only: false}); 
} 

、彼POSTstartDate、彼のfriendsの配列、フラグhidden falseに設定し、publicFlagをfalseに設定します。クエリが構築される:

マングース:test.find({updated_atの:{ '$ GTE':新しい日付( "土、2011年10月15日 00:00:00 GMT")}、隠された:偽、 '$または':[{facebook_username: 'XXXXXXXXXXXXXX'}、{facebook_username: 'YYYYYYYYYYYYYYY'}]}){ フィールド:未定義}

ユーザーはまた、彼の友人(プライベートまたはパブリックないだけを照会することができます)コンテンツだけでなく、他の人の公開コンテンツも含みます。そのためには、彼はPOSTstartDate、彼のfriendsの配列、フラグhiddenをfalseに設定し、publicFlagをtrueに設定します。クエリが構築される:

マングース:test.find({updated_atの:{ '$ GTE':新しい日付( "土、2011年10月15日 00:00:00 GMT")}、隠された:偽、 '$または':[{facebook_username: 'XXXXXXXXXXXXXX'}、{facebook_username: 'YYYYYYYYYYYYYYY'}、{ friends_only:偽}]}){フィールド:未定義}

上記のコードは正常に動作します。

ユーザーが特定のハッシュタグを使用してコンテンツを取得できる場合、別のケースを追加したいと思います。 基本的に、このオプションを選択すると、ハッシュタグのみを含む他のユーザーのコンテンツを見ることができます。その内容は彼のfbの友人の投稿(私的または公的)と他の人々の投稿(公的)です。

if (hashtagsInput != undefined) { 
    var hashtags = hashtagsInput.split(","); 

    for(var i=0; i<hashtags.length; i++) { 
    query = query.or([{ 'hashtags': hashtags[i] }]); 
    } 
} 

が、このソリューションが正常に動作しない:私は私の元node.jsコードにこの条件を追加することについて考えたことについては

ユーザーが彼の友人の(プライベートおよびパブリック)コンテンツなどの公開コンテンツフェッチしたい - しかし、ハッシュタグのいずれかが含まだけその1 - 彼POST S startDateを、彼のfriendsの配列、旗hiddenセットfalseには、publicFlagがtrueに設定され、配列がhashtagsに設定されています。彼がそれをするとき、それはクエリを作成します:

マングース:テスト。} {{hashtags: 'test1'}、{hashtags: 'test2()}、{$ gte':新しい日付( "土、15 Oct 2011 00:00:00 GMT" ' }、{facebook_username 'XXXXXXXXXXXX'}、{facebook_username: 'YYYYYYYYYYYYYYYYYY'}、{friends_only:偽}]、削除:偽}){ フィールド:未定義}

基本的に私は制限します特定のハッシュタグにのみ一般的なクエリ。

このクエリは正しいデータを返しません。今私はmongoose専門家ではなく、私はそれを理解しようとしている昨日のカップル時間を過ごしましたが、問題はそれがどちらかハッシュタグのいずれかを含むデータを返すと思うまたはその著者は私のFacebookの友人。

ユーザーPOSTハッシュタグの場合は、公開されているすべてのユーザーの公開および公開されているコンテンツがフェッチされますが、少なくとも1つのハッシュタグが含まれているコンテンツのみが取得されます。 。また、ユーザーがハッシュタグを提供していないときは、それはそのままで、友人や全員の一般公開コンテンツをすべて取得します。

node.jsコードを修正して、正しいmongooseクエリを作成できるように助けてください。

答えて

1

次のコードは、あなたは私が直接JSON形式でMongoDBのクエリを作成するために使用

var query= {}; 
query.$and = []; 

// and condition on start date 
if(startDate != undefined) { 
    var startDate = new Date(req.param('startDate')); 
    query.$and.push({"updated_at":{$gte: startDate}}); 
} 

// and condition on hastags 
if (hashtagsInput != undefined) { 
    var hashtags = hashtagsInput.split(","); 
    query.$and.push({"hashtags":{$in: hashtags}}); 
} 

// and condition on hidden 
query.$and.push({"hidden":false}); 


// creating a OR condition for facebook friends and public flag 
var friend_query = {}; 
friend_query.$or = []; 

if (friends != undefined) { 
    var friendsSplitted = friends.split(","); 
    friend_query.$or.push({"facebook_username":{$in: friendsSplitted}}); 
} 

if (publicFlag != undefined && publicFlag === "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 = Test.find(query) 

申し訳たいように動作します、あなたがやっているよりも少し異なっています。これはあなたが質問したいと言ったように機能します。

問題が解決しない場合は教えてください。

+0

Puneetさん、ありがとう、私はもう少し小さな質問があります。このクエリで使用する場合は、 'if(username!= undefined){query。$ and.push({" username ":username})}を追加して変更する必要がありますか?または '.equals'などの他の特定の方法がありますか? – user3766930

+1

あなたはquery。$と.push({"username":username})を使う必要がありますが、他の方法でもこれを行うことができますが、私はmongooseメソッドを持つ家庭ではありません。mongodbクエリを直接変更することをお勧めします。より複雑なクエリを作成することができます。 あなたが正しい答えを見つけたらそれを正解としてください。 :) –

+0

あなたの助けのための巨大なおかげさまプネー!最後の1つの質問 - あなたはmongodbクエリの変更について書きましたが、それはどういう意味ですか?あなたは私にコメントの中で何か小さな例を与えることができますか?ありがとう! – user3766930

関連する問題