使用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);
答案 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"})