2013-11-04 8 views
22

Próbuję dynamicznie tworzyć _id dla moich modeli Mongoose, licząc dokumenty w db, i używając tego numeru, aby utworzyć _id (przy założeniu, że pierwszy _id jest równy 0). Jednak nie mogę zmusić _id do ustawienia się z moich wartości. Oto mój kod:Jak ustawić _id na db document w 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); 
}); 

Próbowałem ustawić _id na wiele różnych sposobów, ale to nie działa dla mnie. Oto najnowszy błąd:

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

Jeśli wiesz, co się dzieje, proszę dać mi znać.

Odpowiedz

25

albo trzeba zadeklarować właściwość _id jako część schematu (ty skomentował to), lub użyć opcji _id i ustawić ją na false (używasz opcji id, który tworzy wirtualny getter rzucić _id na ciąg znaków, ale nadal utworzyła właściwość ObjectID obiektu _id, dlatego wystąpił błąd rzutowania.

Więc albo to:

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

albo to:

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

Nawet po wykonaniu tego w moim db.collection.getIndexes() '_id: 1' jest wyświetlany. Czy to prawidłowe zachowanie? –

+0

@SarasArya tak, MongoDB zawsze tworzy indeks dla '_id', niezależnie od jego typu (patrz [tutaj] (https://docs.mongodb.org/v3.0/core/index-single/#index-type- ID)). – robertklep

6

Pierwszy kawałek kodu @ robertklep nie działa dla mnie (mangusta 4), należy również niepełnosprawnych _id

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

i to działa dla mnie

+0

to samo stało się ze mną, dzięki @Tim Qian – Godfather

Powiązane problemy