所以我遇到了这个让我忙碌过去4天的问题,我有一个这样的架构和子文档架构:
var mongoose = require( 'mongoose' ),
Schema = mongoose.Schema;
var ProjectSchema = new Schema({
name: String,
author: String,
category: String,
description: String,
tags: [TagSchema]
});
var TagSchema = new Schema({
name: String,
date: Date
});
mongoose.model( 'TagSchema', TagSchema );
mongoose.model( 'Project', Project );
我想拥有的是所有ProjectSchemas的所有标签的列表,无论我尝试我是否获得NONE或只是最新项目的标签。我只是不知道进一步,因为无论我做什么,我总是最终失败了。我做错了什么,对于猫鼬来说,没有找到这样的东西吗?
app.get('/tags.json', function(req, res) {
TagSchema.find({}, function ( err, tags ){
var json = JSON.stringify(tags);
console.log(json);
tags = tags.map(function (tag) {
return tag.toObject();
});
console.log(json == JSON.stringify(tags));
res.json(json);
});
});
和
app.get('/tags.json', function(req, res) {
Project.find(function (err, projects) {
projects.forEach( function( project ){
res.json(project.tags);
});
});
});
以及我尝试过的其他任何东西
[ ]
或出错...
(另外我想知道,如果我在项目中添加一个标签并且它已经存在,我怎么能保证它不会添加。)
答案 0 :(得分:3)
当您尝试在模型上调用它时,您试图在架构上调用find
。
如果您将文件底部更改为:
var TagModel = mongoose.model( 'TagModel', TagSchema );
var ProjectModel = mongoose.model( 'ProjectModel', Project );
然后在app.get
函数调用中:
app.get('/tags.json', function(req, res) {
TagModel.find({}, function ( err, tags ){ //changed this to the model instead of the schema
var json = JSON.stringify(tags);
console.log(json);
tags = tags.map(function (tag) {
return tag.toObject();
});
console.log(json == JSON.stringify(tags));
res.json(json);
});
});
和
app.get('/tags.json', function(req, res) {
ProjectModel.find(function (err, projects) {
projects.forEach( function( project ){
res.json(project.tags);
});
});
});
模型是根据模式定义编译的构造函数,表示可以从数据库中保存和查询的文档。
答案 1 :(得分:2)
当您在自己的模型中使用TagSchema
并像ProjectSchema
一样嵌入tags
时,了解tags
集合中的文档和{{1}中的文档非常重要项目文档数组没有固有的连接。因此,如果您将标记保存为项目的一部分,那么除非您明确地将标记添加到tags
集合中,否则它们不会最终存储在TagSchema
集合中。
您发布的代码中的一些特定问题:
ProjectSchema
。ProjectSchema
mongoose.model
传递到Project
来电,而不是{{1}}。答案 2 :(得分:1)
在@ alawson421的代码和一些数组魔术的帮助下它完美运行,再次感谢@JohnnyHK向我展示了模式和模型之间的区别。继承人的工作:
app.get('/tags.json', function(req, res) {
ProjectModel.find(function (err, projects) {
var taglist = [];
projects.forEach( function( project ){
//console.log(JSON.stringify(project.tags));
project.tags.forEach( function( tag ){
console.log(tag);
taglist.push(tag.name);
});
});
res.json(taglist);
});
});
,输出为:
[
"test",
"meep",
"lalela",
"another test",
"ihopethisworks",
"noderocks",
"i am not a mongo",
"ice cream rocks"
]