2011-01-03 4 views
19

говорят, что у меня есть список продуктов. Когда я добавляю новый продукт, который я сохранить его, используя что-то вродеПолучите _id вставленного документа в MongoDB?

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

Проблема заключается в том, что я хочу после того, как это делается, чтобы перенаправить пользователя на страницу с продуктом. Поэтому мне нужно перенаправить, скажем, /products/<ObjectID>

Однако я не вижу возможности сразу получить ObjectID без ручного запроса базы данных и поиска документа со всеми теми же полями и т. Д.

Есть ли более простой способ? (также, doc в этом случае возвращает null по какой-либо причине)

ответ

31

Вы можете проверить поле идентификатора вставленного документа. Она должна быть заполнена

Под редакцией спрашивающего:.

Просто чтобы быть ясно, для того, чтобы сделать поле ID в ваших собственных классов, которые вы просто использовать:

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

При вставке объекта в mongodb, mongo обновит объект с помощью внутреннего ID.

Так что если

data = { 
    title: "Howdy" 
} 

Затем, когда мы вставляем объект данных в БД

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

Как комментарий выше, добавьте FILD ID в модели с

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

используя:

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

, а затем, когда вы вставляете объект, mongo возвращает идентификатор документа в идентификатор Fild модели.

0

Если вы знаете тип ID вы можете сделать что-то вроде этого:

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

использовать его как это:

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

Тем не менее, вы должны предпочитаете иметь специальную собственность, как в выбранном ответе ...

Смежные вопросы