【问题标题】:mongoose return json list of tags specified as subdocuments猫鼬返回指定为子文档的标签的 json 列表
【发布时间】:2013-02-20 00:14:07
【问题描述】:

所以我遇到了这个让我在过去 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);
        });
    });
});

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

[ ]

或者出错了……

(另外我想知道,如果我将标签添加到项目中并且它已经存在,我如何才能确保它不会添加。)

【问题讨论】:

    标签: json node.js express mongoose


    【解决方案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"
    ]
    

    【讨论】:

      【解决方案2】:

      您尝试在架构上调用 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);
              });
          });
      });
      

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

      【讨论】:

      • 像你说的那样定义了所有东西,这对我有点帮助,因为第二个代码最终显示了 json 中的标签,但我发现它只是从最后编辑的项目中返回标签,而不是全部存在的标签。实际上,如果我添加 console.log(JSON.stringify(project.tags));它在控制台中显示所有这些。
      • 在其中添加 var taglist = []; 并将 taglist.push(project.tags); 添加到 foreach 中,如果我在 json 中渲染 taglist 数组就可以了!
      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,我想我基本上刚刚发现,由于你们的帮助,模式和模型之间存在差异,谢谢!我会及时通知你。
      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2023-03-06
      • 2015-01-06
      • 1970-01-01
      • 2020-12-25
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多