2011-01-03 8 views
19

dire che ho un elenco di prodotti. Quando aggiungo un nuovo prodotto risparmio utilizzando qualcosa comeOttieni _id di un documento inserito in MongoDB?

var doc=products.Insert<ProductPDO>(p); 

Il problema è che io voglio, dopo che questo è fatto per reindirizzare l'utente alla pagina con il prodotto. Quindi devo reindirizzare per dire /products/<ObjectID>

Tuttavia, non vedo alcun modo di ottenere l'ObjectID subito dopo senza interrogare manualmente il database e cercare un documento con tutti gli stessi campi e così via.

C'è un modo più semplice? (anche, doc in questo caso restituisce null per qualche motivo)

risposta

31

È possibile verificare il campo ID del documento inserito. Esso deve essere compilato

A cura di richiedente:.

Giusto per essere chiari, al fine di rendere un campo ID nelle proprie classi basta usare:

[BsonId] 
public ObjectId ID{get;set;} 
10

Quando si inserisce un oggetto nel mongodb, mongo aggiornerà l'oggetto con l'ID interno.

Quindi, se

data = { 
    title: "Howdy" 
} 

Poi, quando inseriamo l'oggetto dati nel db

db.collection('collectionName', function(err, collection) { 
    collection.insert(data); 
    console.log(data._id); // <- The mongodb id is now set on the item 
}); 
3

Come il commento di cui sopra, aggiungere l'ID fild nel modello con

[BsonId] 
[BsonRepresentation(BsonType.ObjectId)] 
public string id { get; set; } 

utilizzando:

using MongoDB.Bson; 
using MongoDB.Bson.Serialization.Attributes; 

e quindi quando si inserisce l'oggetto, mongo restituisce l'ID del documento nell'ID fild del modello.

0

Se si conosce il tipo di ID che si può fare qualcosa di simile:

public static TId GetId<TId>(this BsonDocument document) where TId : struct 
{ 
    if (document == default(BsonDocument)) 
    { 
     throw new ArgumentNullException("document"); 
    } 

    var id = document["_id"]; 

    object idAsObject; 

    if (id.IsGuid) 
    { 
     idAsObject = (object)id.AsGuid; 
    } 
    else if (id.IsObjectId) 
    { 
     idAsObject = (object)id.AsObjectId; 
    } 
    else 
    { 
     throw new NotImplementedException(string.Format("Unknown _id type \"{0}\"", id.BsonType)); 
    } 

    var idCasted = (TId)idAsObject; 

    return idCasted; 
} 

Utilizzare in questo modo:

Guid idOfDoc = myBsonDocument.GetId<Guid>(); 

Ancora si dovrebbe prefere avere una proprietà dedicata come nella risposta scelta ...

Problemi correlati