2016-10-15 41 views
0

當用戶向我的node.js應用程序提交內容時,他提出了四件事:start_date,他的facebook用戶名,文本內容和一個標誌,內容應該是每個人都可見還是隻能看到他的Facebook好友。我的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}); 
} 

有了上面的代碼,當只有從他的朋友含量用戶查詢(可能是私人或公共),他POST小號startDate,他friends陣列,標誌hidden設置爲false並且publicFlag設置爲false。查詢構造:

貓鼬:test.find({的updated_at:{ '$ GTE':新的日期( 「星期六,2011年10月15日 00:00:00 GMT」)},隱藏的:假的, '$或':[{facebook_username: 'XXXXXXXXXXXXXX'},{facebook_username: 'YYYYYYYYYYYYYYY'}]}){ 領域:未定義}

用戶還可以查詢不僅是他的朋友(私有或公共)內容,而且還有其他人的公開內容。爲此,他POST s startDate,他的數組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朋友帖子(私人或公共)和其他人的帖子(這是公開的)。

對於我想過加入這個條件,我原來node.js代碼:

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

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

但這種方法不能正常工作。

當用戶想取他的朋友(私人和公共)內容和其他的公共內容 - 但只有一個包含主題標籤的一個 - 他POST小號startDate,他friends陣列,標誌hidden集爲假,publicFlag設置爲true,並且他的數組爲hashtags。當他這樣做時,它會創建一個查詢:

貓鼬:測試。find({updated_at:{'$ gte':new Date(「Sat,2011年10月15日 00:00:00 GMT」)},'$ or':[{hashtags:'test1'},{hashtags:'test2 ' },{facebook_username: 'XXXXXXXXXXXX'},{facebook_username: 'YYYYYYYYYYYYYYYYYY'},{friends_only:假}],刪除:假}){ 字段:未定義}

基本上我想限制一般只查詢具體的井號標籤。

此查詢不返回正確的數據。現在我不是mongoose專家,我昨天花了幾個小時試圖弄清楚,但我認爲問題是它返回的數據要麼包含標籤之一,要麼是其作者是我的Facebook朋友之一。

我想修復此查詢,以便 - 如果用戶名爲POST s標籤 - 它會獲取其朋友和公衆的公開和私密內容,但只會包含那些至少包含其中一個主題標籤的內容。當用戶不提供標籤時 - 它應該像現在這樣工作,獲取他朋友的所有私人和公共內容,並公開所有人。

您能否幫我修復我的node.js代碼,以便它創建正確的mongoose查詢?

回答

1

下面的代碼將工作,只要你想

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) 

對不起,我直接使用JSON格式創建MongoDB的查詢,它比你正在做的有點不同。這將按照你提到的你想要的方式工作。

如果它不能解決你的問題告訴我。

+0

謝謝普尼特,它工作得很好,我只有一個小問題 - 如果我想傳遞另一個參數,例如,用戶名並在此查詢中使用它,我必須通過添加以下內容來修改它:'if(username!= undefined){query。$ and.push({「username」:username})}?或者是否有其他特定的方式,比如'.equals'等? – user3766930

+1

你需要使用query。$ and.push({「username」:username}),你也可以用其他方式做到這一點,但我不是帶有貓鼬方法的家庭,我還建議你直接更改mongodb查詢,你可以進行更復雜的查詢。 如果您發現答案有用,請接受它作爲正確答案。 :) –

+0

巨大的感謝您的幫助Puneet!最後一個問題 - 你寫了關於更改MongoDB查詢的問題,你是什麼意思?你能給我一些小例子嗎?在評論什麼改變什麼?謝謝! – user3766930

相關問題