2015-05-27 132 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'等)。