2016-08-12 107 views
3

我有文章和用戶集合。 userId是模型數據類型Schema.ObjectId。在視圖中,我展示了所有文章,並在頂部顯示了所有用戶的下拉列表以過濾文章。如果選擇了下拉的佔位符,則所有文章都將返回,如果選擇了任何用戶,那麼該用戶的文章將被退回。我的API代碼如下。當選擇下拉的佔位符時,UserId查詢字符串將具有空值,否則它將具有任何正在出現的用戶ID。如果條件變量爲空,如何返回所有記錄?

exports.list = function (req, res) { 
    var userId = ''; 
    if (req.query.UserId) { 
     userId = req.query.UserId; 
    } 
    Article.find({userId: userId}).exec(function (err, articles) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(articles); 
     } 
    }); 
}; 

現在的問題是,因爲當查詢字符串參數爲空,查詢試圖尋找其中有userId爲空白這些條款我不能返回的所有文章。那麼,如果條件參數爲空或空,我怎麼能跳過條件檢查?

我想要做的和下面給出的一樣,即C#LINQ查詢。

var userId = <value from query string>; 
var lstArticles = dbContext.Articles.Where(objArticle => (userId == '' || objArticle.userId == userId)); 
+0

@chridam對不起我的壞,這是錯字,糾正它。 – Xyroid

回答

1

只需使用req.query對象,因爲它是一個包含在路由每個查詢字符串參數的屬性的對象。如果沒有查詢字符串,它是空對象,{}

// GET /api/articles?userId=57ac922c457312e0e5c1ad6c 
req.query.userId 
// => "57ac922c457312e0e5c1ad6c" 

// GET /api/articles?userId=57ac922c457312e0e5c1ad6c 
req.query 
// => { "userId": "57ac922c457312e0e5c1ad6c" } 

// GET /api/articles 
req.query.userId 
// => undefined 

// GET /api/articles 
req.query 
// => {} 

因此

exports.list = function (req, res) { 
    var q = req.query; 
    if (req.query.UserId) { 
     q.user = req.query.UserId; // because you have a different key in your database 
    } 
    Article.find(q).exec(function (err, articles) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(articles); 
     } 
    }); 
}; 

- 編輯 -

既然你在{ user: userId }糾正錯字在你的問題上user鍵,可以簡單地使用req.query對象作爲你的貓鼬查找查詢文件,只要屬性(req.query參數)匹配數據庫中的文檔字段:

路線

/api/articles       → Article.find({ }) 
/api/articles?userId=foo    → Article.find({ userId: 'foo' }) 
/api/articles?title=bar    → Article.find({ title: 'bar' }) 
/api/articles?userId=foo&title=bar → Article.find({ userId: 'foo', title: 'bar' }) 

API

exports.list = function (req, res) {   
    Article.find(req.query).exec(function (err, articles) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(articles); 
     } 
    }); 
}; 

上述方法意味着通過在任何req.query參數將被用作find()查詢,以便其recommened因此它只包含在你的架構中定義的字段在find()方法使用它之前過濾req.query

例如,假設req.query對象有user參數,但你已經在你的模式定義的userId場,你可以將其過濾爲:

var q = {}; 
if (req.query.user) { 
    q.userId = req.query.user; // because you have a different key in your database 
} 
Article.find(q).exec(callback); 
+0

要解決您的問題,我必須保持查詢字符串參數鍵與* case sensitivity *的mongodb路徑相同,是嗎? – Xyroid

+0

正確,這意味着傳入的任何'req.query'參數將被用作'find()'查詢,因此它在'find()'方法中使用它之前推薦過濾'req.query',因此它只包含在您的模式中定義的字段。 – chridam

+0

但仍然沒有解決空查詢字符串問題。如果我要求'/ api/articles?userId = foo&title =',它會搜索空白標題的文章。 – Xyroid

相關問題