2013-11-04 7 views
22

Ich versuche, _id's für meine Mongoose-Modelle dynamisch zu erstellen, indem ich die Dokumente in der Datenbank zähle und diese Nummer benutze, um _id zu erstellen (vorausgesetzt, die erste _id ist 0). Allerdings kann ich die _id nicht aus meinen Werten setzen. Hier ist mein Code:Wie setze _id auf db Dokument in Mongoose?

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

Ich habe versucht, die _id eine Reihe von verschiedenen Möglichkeiten zu setzen, aber es funktioniert nicht für mich. Hier ist der neueste Fehler:

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

Wenn Sie wissen, was los ist, lass es mich wissen.

Antwort

25

Sie müssen entweder die _id Eigenschaft als Teil des Schemas erklären (Sie es heraus kommentiert), oder verwenden Sie die _id Option und setzen Sie ihn auf false (Sie verwenden die id Option, die eine virtuelle Getter erzeugt zu werfen _id zu einem String, aber immer noch eine _id ObjectID Eigenschaft, daher der Casting-Fehler, den Sie bekommen).

Also entweder das:

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

Oder diese:

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

Auch nachdem ich dies in meinem db.collection.getIndexes() getan habe, wird '_id: 1' angezeigt. Ist das korrektes Verhalten? –

+0

@SarasArya Ja, MongoDB erstellt immer einen Index für '_id', unabhängig von seinem Typ (siehe [hier] (https://docs.mongodb.org/v3.0/core/index-single/#index-type- Ich würde)). – robertklep

6

Der erste Teil des Codes des @ robertklep hat bei mir nicht funktioniert (Mungo 4), müssen auch für behinderte _id

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

und dies funktioniert für mich

+0

das gleiche passierte mit mir, danke @Tim Qian – Godfather

Verwandte Themen