2013-11-04 10 views
22

私は、DB内のドキュメントを数え、その番号を使って_id(最初の_idが0であると仮定して)を作成することで、モンゴースモデルの_idを動的に作成しようとしています。しかし、私の値から設定する_idを取得することはできません。私のコードは次のとおりです。Mongooseで_idをDB文書に設定する方法は?

//Schemas 
var Post = new mongoose.Schema({ 
    //_id: Number, 
    title: String, 
    content: String, 
    tags: [ String ] 
}); 

var count = 16; 

//Models 
var PostModel = mongoose.model('Post', Post); 

app.post('/', function(request, response) { 

    var post = new PostModel({ 
     _id: count, 
     title: request.body.title, 
     content: request.body.content, 
     tags: request.body.tags 
    }); 

    post.save(function(err) { 
     if(!err) { 
      return console.log('Post saved'); 
     } else { 
      console.log(err); 
     } 
    }); 

    count++; 

    return response.send(post); 
}); 

私は_idにさまざまな方法を設定しようとしましたが、うまくいきません。最新のエラーは次のとおりです。

{ message: 'Cast to ObjectId failed for value "16" at path "_id"', 
    name: 'CastError', 
    type: 'ObjectId', 
    value: 16, 
    path: '_id' } 

何が起こっているのか分かっている場合は、教えてください。あなたは(あなたがそれをコメントアウト)スキーマの一部として_idプロパティを宣言する必要がある、または_idオプションを使用してfalseに設定のいずれか

答えて

25

(あなたが唱えるための仮想ゲッターを作成idオプションを、使用しています_idを文字列に変換しましたが、依然として_idのObjectIDプロパティが作成されました。したがって、取得したキャストエラーです)。

だから、このいずれか:

var Post = new mongoose.Schema({ 
    _id: Number, 
    title: String, 
    content: String, 
    tags: [ String ] 
}); 

またはこの:

var Post = new mongoose.Schema({ 
    title: String, 
    content: String, 
    tags: [ String ] 
}, { _id: false }); 
+0

db.collection.getIndexes()でこれを行った後でも、 '_id:1'が表示されています。これは正しい動作ですか? –

+0

@SarasAryaはい、MongoDBは、そのタイプに関係なく、常に '_id'のインデックスを作成します([here](https://docs.mongodb.org/v3.0/core/index-single/#index-type- id))。 – robertklep

6

@のrobertklepのコードの最初の部分は私のために動作しません(4マングース)、また

_id無効にする必要があり
var Post = new mongoose.Schema({ 
    _id: Number, 
    title: String, 
    content: String, 
    tags: [ String ] 
}, { _id: false }); 

これは私にとって役に立ちます

+0

私と同じことが起こった、ありがとう@Tim Qian – Godfather

関連する問題