mongoose返回指定为子文档的标记的json列表

mongoose返回指定为子文档的标记的json列表,json,node.js,express,mongoose,Json,Node.js,Express,Mongoose,所以我遇到了这个问题,在过去的4天里我一直很忙,我有一个模式和子文档模式,如下所示: var mongoose = require( 'mongoose' ), Schema = mongoose.Schema; var ProjectSchema = new Schema({ name: String, author: String, category: String, description: String, tags: [TagSchema

所以我遇到了这个问题,在过去的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 );
我想要的是所有项目模式的所有标记的列表,无论我尝试什么,我要么没有,要么只有最新项目的标记。我只是不知道进一步,因为无论我做什么,我总是在这一点上失败。我做错了什么,难道没有猫鼬的findAll吗

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);
    });
});

我试过的其他东西都回来了

[ ]
或是出错了


(此外,我想知道,如果我向一个项目添加了一个标记,并且该标记已经存在,我如何确保它不被添加。)

您正试图在模式上调用
find
,而您应该在模型上调用它

如果将文件底部更改为:

var TagModel     = mongoose.model( 'TagModel', TagSchema );
var ProjectModel = mongoose.model( 'ProjectModel', Project );
然后在你的
应用程序中。获取
函数调用:

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);
    });
});


模型是根据模式定义编译的构造函数,表示可以从数据库中保存和查询的文档。

当您在自己的模型中使用
TagSchema
并嵌入
ProjectSchema
时,了解
标记
集合中的文档和项目文档的
标记
数组中的文档没有内在的联系是很重要的。因此,如果将标记另存为项目的一部分,则这些标记不会出现在
标记
集合中,除非您明确地将它们添加到该集合中

您发布的代码中有几个具体问题:

  • ProjectSchema
    中使用它之前,需要先定义
    TagSchema
  • 您应该将
    ProjectSchema
    传递到
    mongoose.model
    调用中,而不是
    Project
  • 保持模式名和模型名分开,因为代码中的内容不清楚

  • 借助@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"
    ]
    

    是的,我想我基本上刚刚发现,由于你们的帮助,模式和模型之间存在差异,谢谢!我会让您不断更新。像您所说的那样定义了所有内容,这对我有所帮助,因为第二段代码最终显示了json中的标记,但我发现它只返回了最后编辑的项目中的标记,而不是所有存在的标记。实际上,如果我添加console.log(JSON.stringify(project.tags));它将在控制台中显示所有这些属性。添加
    var taglist=[]
    标记列表.push(project.tags)导入到foreach中就可以了!
    
    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"
    ]