我第一次尝试用 Angular + express + mongodb 构建一些东西,所以我可能完全错误地这样做。Express 用于提供 json。然后,Angular负责所有视图等。
我正在使用猫鼬与Mongo互动。
我有以下数据库架构:
var categorySchema = new mongoose.Schema({
title: String, // this is the Category title
retailers : [
{
title: String, // this is the retailer title
data: { // this is the retailers Data
strapLine: String,
img: String , // this is the retailer's image
intro: String,
website: String,
address: String,
tel: String,
email: String
}
}
]
});
var Category = mongoose.model('Category', categorySchema);
在 Express 中,我有几条获取数据的途径:
app.get('/data/categories', function(req, res) {
// Find all Categories.
Category.find(function(err, data) {
if (err) return console.error(err);
res.json(data)
});
});
// return a list of retailers belonging to the category
app.get('/data/retailer_list/:category', function(req, res) {
//pass in the category param (the unique ID), and use that to do our retailer lookup
Category.findOne({ _id: req.params.category }, function(err, data) {
if (err) return console.error(err);
res.json(data)
});
});
以上有效 - 我只是在试图进入一家零售商时遇到了很大的问题。我正在传递类别和零售商 ID... 我尝试了各种各样的事情 - 从对类别进行查找,然后在其中的内容上进行查找......但我就是无法让它工作。我可能都做错了...
我在这里找到了这个线程:在 Mongoose 中查找一个子文档并实施了解决方案——但是,它返回了我所有的零售商——而不仅仅是我想要的零售商。
// Returns a single retailer
app.get('/data/retailer_detail/:category/:id', function(req, res) {
//pass in the category param (the unique ID), and use that to do our retailer lookup
Category.findOne({_id: req.params.category , 'retailers.$': 1}, function(err, data) {
console.log(data);
if (err) return console.error(err);
res.json(data)
});
});
谢谢抢
现在我看到了完整的过滤器/查询,在这种情况下,您应该能够使用数组位置运算符作为投影的一部分,而不是执行客户端过滤:
app.get('/data/retailer_detail/:category/:id', function(req, res) {
//pass in the category param (the unique ID), and use that to do our retailer lookup
Category.findOne({
/* query */
_id: req.params.category ,
'retailers._id' : req.params.id
},
{ /* projection */
"retailers.$" : 1
},
function(err, data) {
var retailer = _.where(data.retailers , { id : req.params.id });
if (err) return console.error(err);
res.json(retailer)
});
});
要使{ "retailers.$" : 1 }
正常工作,查询必须包含数组中元素中的字段。$
运算符仅返回第一个匹配项。
隔壁的人使用Mongo + Express,并给了我一些指示:他们向我解释了mongo的工作原理,并建议我应该使用下划线.js来帮助我的过滤器。
他们说我需要把整个类别拉出来——然后运行过滤器。我并不严格需要 , 'retailers._id' : req.params.id} 但他们说要保留它,因为它保证只有在其中的项目包含该信息时才会返回该类别。我仍然不知道为什么或如何...所以不能真正将此标记为已解决。.它解决了,但我真的不明白为什么 - 所以会做更多的阅读:)
app.get('/data/retailer_detail/:category/:id', function(req, res) {
//pass in the category param (the unique ID), and use that to do our retailer lookup
Category.findOne({_id: req.params.category , 'retailers._id' : req.params.id}, function(err, data) {
var retailer = _.where(data.retailers , { id : req.params.id });
if (err) return console.error(err);
res.json(retailer)
});
});