Получить _id вставленного документа в MongoDB?
Скажем, у меня есть список продуктов. Когда я добавляю новый продукт, я сохраняю его, используя что-то вроде
var doc=products.Insert<ProductPDO>(p);
Проблема в том, что я хочу, чтобы после этого было сделано для перенаправления пользователя на страницу с продуктом. Поэтому мне нужно перенаправить, чтобы сказать /products/<ObjectID>
Однако я не вижу возможности сразу получить ObjectID без ручного запроса базы данных и поиска документа со всеми теми же полями и т.д.
Есть ли более простой способ? (также, doc
в этом случае возвращает null по какой-либо причине)
Ответы
Ответ 1
Метод Insert
автоматически устанавливает свойство, объявленное в качестве идентификатора BSON модели.
Если объявлено следующим образом...
[BsonId]
public ObjectId Id { get; set; }
... тогда поле Id
будет содержать идентификатор BSON по умолчанию (новый, уникальный) объекта после вставки объекта в коллекцию:
coll.Insert(obj);
// obj.Id is now the BSON ID of the object
Ответ 2
Когда вы вставляете объект в mongodb, mongo обновляет объект с помощью внутреннего ID.
Итак, если
data = {
title: "Howdy"
}
Затем, когда мы вставляем объект данных в db
db.collection('collectionName', function(err, collection) {
collection.insert(data);
console.log(data._id); // <- The mongodb id is now set on the item
});
Ответ 3
Как комментарий выше, добавьте идентификатор fild в вашу модель с помощью
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string id { get; set; }
с помощью:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
а затем, когда вы вставляете объект, mongo возвращает идентификатор документа в идентификатор Fild модели.
Ответ 4
Если вы знаете тип удостоверения личности, вы можете сделать что-то вроде этого:
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>();
Тем не менее, вы должны иметь выделенное свойство, как в выбранном ответе...
Ответ 5
Я преобразую пользовательский тип T
в BsonDocument
прежде чем BsonDocument
его.
var bsonDocument = item.ToBsonDocument();
_mongoCollection.InsertOne(bsonDocument);
T
имеет свойство Id:
[BsonId]
public ObjectId Id { get; set; }
Когда я вызываю ToBsonDocument()
, поле Id
заполняется ObjectId
который ObjectId
в БД Mongo.
Он создает сам Id в коде, а не делегирует его в БД Mongo. Но этого достаточно для моего случая.