【问题标题】:node-restful GET query string for querying a sub-entity用于查询子实体的 node-restful GET 查询字符串
【发布时间】:2015-06-17 11:10:21
【问题描述】:

使用 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);

【问题讨论】:

    标签: node.js rest express mongoose


    【解决方案1】:

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

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

    ?tags.name__eq=amazon
    

    ?tags%20name__eq=amazon
    

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

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

    如果您使用字符串数组来表示模型中的标签,它也可能按原样工作。

    不过,如果库有此限制,您迟早会再次遇到这种情况,并且无法通过更改模型来解决它。

    【讨论】:

    • 查看源代码,看看是否支持关键路径,但我认为它们不支持。分叉项目并自己修复它:)
    【解决方案2】:

    node-restful里面有Populating a sub-entity,你可以这样试试

    【讨论】:

      【解决方案3】:

      "find" 方法返回一个 Promise,尝试插入一个 "await" 以返回结果,直到 Promise 被解决。

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

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 2019-03-14
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 2016-07-10
        • 2011-10-05
        • 2018-04-14
        相关资源
        最近更新 更多