2

私は以下のスキーマを持っています:

var StorySchema = new Schema({
  title:        { type: String, required: true },
  users:        { 
                  id:        { type: Schema.ObjectId, ref: 'users' },
                  creator:   { type: Boolean } 
                },       
  maxlines:     { type: Number, default: '10'},
  lines:        {
                  text:       { type: String },
                  entered_at: { type: Date }, 
                  user:       {
                                id:   { type: Schema.ObjectId, ref: 'users' }
                              }
                },
  created_date: { type: Date, default: Date.now }, 
  updated_date: { type: Date, default: Date.now },        
})

私はクエリを実行する以下を持っています:

 exports.view = function (req, res) {  
    Stories
        .findOne({
            _id: req.params.id
        })
        /*.populate('users') */ **<-- If I uncomment this I get the error**
        .exec(function (err, story) {
            if (err) {
                res.json(200, {
                    success: "false",
                    message: err.message
                })
            } else if (story) {
                res.json({
                    sucess: "true",
                    message: story
                })
            } else {
                res.json(200, {
                    sucess: "false",
                    message: "story not found"
                })
            }
        })
}

上記のように追加する.populate('users')と、以下のエラーにフラグが立てられます。

{
    "success": "false",
    "message": "Cast to ObjectId failed for value \"[object Object]\" at path \"_id\""
}

URL を呼び出す.populate('users')と、ドキュメントが返されます。

users -> id の値にはObjectId("51fbe87ec137760025000001")、ユーザー コレクション内の有効な _id が入力されます。

何が欠けているのかわかりませんか?

追加されたユーザー スキーマ

var UserSchema = new Schema({
  name:                 { type: String, required: true },
  email:            { type: String, required: true, unique: true },
  username:         { type: String, required: true, unique: true },
  provider:         { type: String, required: true, enum: ['local', 'facebook']    },
  password:         { type: String, required: true },
  avatar:           { type: String, default: 'http://i.imgur.com/1PtcFos.jpg' },
  gender:           { type: String, required: true, uppercase: true, enum: ['M', 'F'] },
  facebook:         {
                 id:     { type: String }, 
                 token:   { type: String },
                 token_expiry: { type: Date }
                        },
  device:       {
                  token:        { type: String },
                  type:         { type: String, enum: ['ios', 'android'] },
                  badge:        { type: Number },
                  id:           { type: String },
                  created_date: { type: Date, default: Date.now },
                  updated_date: { type: Date, default: Date.now }
                },              
  created_date: { type: Date, default: Date.now },
  updated_date: { type: Date, default: Date.now }              
})
4

1 に答える 1

4

あなたしかできないと思います.populate('users.id')Populateidは、参照オブジェクトを使用してフィールドを置き換えることです。ドキュメントをご覧ください。

于 2013-08-02T22:47:06.943 に答える