2015-05-27 102 views
1

我正在學習MEAN堆棧。我有一個連接到MongoLab託管數據庫的節點api。查詢帶有Restangular的節點api/MongoDB

API返回這樣的對象(api/messages):

[ 
    { 
    _id: "55074ce3c21903c9cce6d02a", 
    name: "some random message", 
    __v: 0 
    }, 
    { 
    _id: "55074e4a1dad546fcef09769", 
    name: "a different message", 
    __v: 0 
    }, 
    { 
    _id: "55074e4a1dad546fcef09123", 
    name: "bingo", 
    __v: 0 
    } 
] 

隨着restangular,我得到的數據,然後綁定到$scope

Restangular.all('api/messages').getList().then(function (data){ 
    $scope.messages = data; 
}); 

在應用程序中的一部分,我想僅查詢/返回必要的數據 - 例如:

Restangular.all('api/messages').customGET('', {"q": {"name": "a different message" }}).then(function (data) { 
    console.log(data); 
}); 

我只想只有返回包含X的對象 - 在這種情況下,「不同的消息」。

然而,customGET方法似乎沒有像我期望的那樣工作;我總是得到全部的對象。

我該如何做到這一點?我一直在尋找和嘗試一段時間沒有成功。也許我需要添加一些API路線和方法。

任何幫助,將v.appreciated :)

回答

0

答案是發送API的對象你想要的查詢。正確讀取查詢後,API可以查詢數據庫並返回數據。

這裏是一步一步的例子:

角控制器

在我的情況,我想創建與來自自動生成的數組的多個項目的查詢。爲了簡便:

var randomUsernames = [ 
    'bill', 'ben', 'james', 'phil' 
]; 

然後我們創建一個對象Restangular:

var objectForRestangular = { 
    randomUsernames : randomUsernames 
} 

現在我們可以做一個Restangular customGET承諾:

Restangular.all('api').customGET('messages', objectForRestangular).then(function (data){ 
    $scope.items = data; 
}, function (err){ 
    console.warn('oh no!', err); 
}); 

,這將產生一個API端點是這樣的:

/api/messages?randomUsernames=bill&randomUsernames=ben&randomUsernames=james

節點API

我們可以用快遞的req.query引用字符串參數的路線:

router.route('/messages') 
    .get(function (req, res) { 

    var usernames = req.query.randomUsernames; 

    console.log('we have ' + usernames.length + ' usernames: ' + usernames) 

    }); 

查詢數據庫

一個例子中的物體:

{ 
    _id: '123123123123123' 
    username: 'thor', 
    time: '09/08/2015', 
    copy: 'hey guys, have you seen this? http://random.org', 
    userLikes: [ 
    { 
     username: 'bill',  //check this for a match 
     _id: '34567890' 
     }, 
    { 
     username: 'ben',  //check this for a match 
     _id: '67890132' 
    } 
    ] 
}, 
{ ... }, 
{ ... } 

我想從嵌套數組userLikes中的查詢randomUsernames返回包含匹配值的數據庫中的任何對象。

我使用Mongoose進行數據庫操作,所以我們可以使用$in operator。這對於這樣的查詢來說非常完美。總之:

router.route('/messages') 
    .get(function (req, res) { 

    var usernames = req.query.randomUsernames; 

    console.log('we have ' + usernames.length + ' usernames: ' + usernames) 

    Message.find({ username: { $in: userLikes } }, function (err, messages) { 
     if (err) { 
     res.send(err); 
     } else { 
     res.json(messages); 
     } 
    }); 

    }); 

所以,現在你可以使用Restangular的customGET方法將查詢發送到API,它查詢數據庫,然後返回數據。 :-)

如果有人感興趣,有一個這樣的例子以及更多here

請注意,這個答案中的例子只是模擬數據(例如'messages','Message'等)。