2011-01-03 10 views
19

Powiedz, że mam listę produktów. Kiedy dodać nowy produkt mogę zapisać go za coś takiegoPobrać _id wstawionego dokumentu w MongoDB?

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

Problem polega na tym, że chcę po to nastąpi przekierowanie użytkownika do strony z produktem. Tak więc muszę przekierować, aby powiedzieć /products/<ObjectID>

Jednak nie widzę sposobu na uzyskanie ObjectID zaraz potem bez ręcznego wysyłania zapytań do bazy danych i szukania dokumentu z tymi samymi polami i takimi.

Czy jest łatwiejszy sposób? (również, doc w tym przypadku zwraca wartość null z jakiegoś powodu)

Odpowiedz

31

Możesz sprawdzić pole id wstawionego dokumentu. Należy wypełnić

Edytowane przez pytającego.

żeby była jasność, aby uczynić pole id we własnych klasach po prostu użyć:

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

Po wstawieniu obiektu do mongodb, mongo zaktualizuje obiekt wewnętrznym ID.

Więc jeśli

data = { 
    title: "Howdy" 
} 

Wtedy kiedy wstawić obiekt danych do db

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

As komentarzu powyżej, należy dodać identyfikator fild w modelu z

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

użycie:

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

, a następnie po włożeniu obiektu, mongo zwraca identyfikator dokumentu do lepszego identyfikatora modelu.

0

Jeśli znasz typ ID można zrobić coś takiego:

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

używać go tak:

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

Wciąż należy preferują mieć specjalną właściwość jak w wybranej odpowiedzi ...

Powiązane problemy