3

所以我有这个问题让我在过去的 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,要么只是最新项目的标签。我只是不知道更多,因为无论我做什么,我总是以失败告终。我做错了什么,猫鼬没有 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);
    });
});

app.get('/tags.json', function(req, res) {
    Project.find(function (err, projects) {
        projects.forEach( function( project ){
            res.json(project.tags);
        });
    });
});

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

[ ]

或者出错了...

(另外我想知道,如果我将标签添加到项目中并且它已经存在,我如何确保我可以阻止它添加。)

4

3 回答 3

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

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

于 2013-03-05T15:00:52.813 回答
2

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

您发布的代码中的一些具体问题:

  1. 你需要TagSchema在使用它之前定义它ProjectSchema
  2. 您应该传递ProjectSchemamongoose.model呼叫,而不是Project.
  3. 将架构和模型名称分开,因为不清楚代码中的内容。
于 2013-03-05T15:02:15.873 回答
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"
]
于 2013-03-05T17:05:25.310 回答