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

时间:2013-03-05 14:33:13

标签: 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]
});

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

以及我尝试过的其他任何东西

[ ]

或出错...

(另外我想知道,如果我在项目中添加一个标签并且它已经存在,我怎么能保证它不会添加。)

3 个答案:

答案 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集合中。

您发布的代码中的一些特定问题:

  1. ProjectSchema
  2. 中使用之前,您需要先定义ProjectSchema
  3. 您应该将mongoose.model传递到Project来电,而不是{{1}}。
  4. 将您的架构和模型名称分开,因为不清楚代码中的内容。

答案 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"
]