node-restful GET查询字符串,用于查询子实体

时间:2015-04-11 21:35:40

标签: node.js rest express mongoose

使用Node + Express + Mongoose + node-restful

https://github.com/baugarten/node-restful

我面临的问题是过滤子实体数据。

对于node-restful

Model Schema定义如下

//Schema
var postSchema = new mongoose.Schema({

    title: { type: 'String', required: true },
    content: { type: 'String', required: true },
    tags: [{ name : {type: 'String'} }]

});

当我执行获取请求时,这就是我得到的 这是正确的,因为我只有两个记录。

http://localhost:3000/api/post

[
    {
        "_id": "5529866ae1ad43bd95d6b335",
        "title": "amazon My Post",
        "content": "dasdd This is a post with some tags",
        "tags": [
            {
                "name": "amazon"
            },
            {
                "name": "tracking"
            }
        ]
    },
    {
        "_id": "55298674e1ad43bd95d6b336",
        "title": "flipkart My Post",
        "content": "dasdjkjfkajd This is a post with some tags",
        "tags": [
            {
                "name": "flipkart"
            },
            {
                "name": "tracking"
            }
        ]
    }

]

我想做这样的事情 http://localhost:3000/api/post/?tags.name=amazon

它应该只返回一条记录,其tag.name为“amazon”

如果我在mongodb上触发db.getCollection('posts')。find({“tags.name”:“amazon”}),这怎么工作正常,如何使用node-restful

[
    {
        "_id": "5529866ae1ad43bd95d6b335",
        "title": "amazon My Post",
        "content": "dasdd This is a post with some tags",
        "tags": [
            {
                "name": "amazon"
            },
            {
                "name": "tracking"
            }
        ]
    }

]

而是将所有结果归还给我。

我哪里错了。

有没有更好的方法在mongo db中存储标签

我的代码如下

server.js

// Dependencies
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

// MongoDB
mongoose.connect('mongodb://localhost/NodeMongo');

// Express
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

//Enable CORS
app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

app.use('/api',require('./routes/api'));

// Start Server
app.listen(3000);
console.log('Api is running on port 3000');

api.js

// Dependencies
var express = require('express');
var router = express.Router();

Post.methods(['get', 'post', 'put', 'delete']);
Post.register(router, '/post');

module.exports = router;

post.js

// Dependencies
var restful = require('node-restful');
var mongoose = restful.mongoose;

//Schema
var postSchema = new mongoose.Schema({

    title: { type: 'String', required: true },
    content: { type: 'String', required: true },
    tags: [{ name : {type: 'String'} }]

});


//Return model 
module.exports = restful.model('Posts', postSchema);

3 个答案:

答案 0 :(得分:1)

我认为你代表标签的方式很好,但如果你在标签上只有一个属性,为什么不只是一个字符串数组呢?

看看github,我看到node-restful使用django之类的符号进行过滤。你试过吗?

?tags.name__eq=amazon

?tags%20name__eq=amazon

如果它不起作用,那么库可能不支持将嵌套属性作为关键路径进行寻址。

您可能很容易自己添加功能。

如果您使用字符串数组来表示模型中的标记,它可能也会按原样运行。

迟早,如果图书馆有此限制,您将再次遇到这种情况,并且无法通过更改模型来解决这个问题。

答案 1 :(得分:0)

Populating a sub-entity处于节点依赖状态,您可以尝试这种方式

答案 2 :(得分:0)

“查找”方法返回Promise,仅在解决Promise之后,尝试插入“ await”以返回结果。

await db.getCollection('posts').find({ "tags.name" : "amazon"})