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ことを理解することが重要です。したがって、タグをプロジェクトの一部として保存する場合、それらを明示的に追加しない限り、それらはコレクションに含まれません。tagstagstags

投稿されたコードのいくつかの特定の問題:

  1. TagSchemaで使用する前に定義する必要がありますProjectSchema
  2. ProjectSchemaではなく、mongoose.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 に答える