Получить _id вставленного документа в MongoDB? - PullRequest
26 голосов
/ 03 января 2011

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

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

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

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

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

Ответы [ 5 ]

43 голосов
/ 03 января 2011

Метод Insert автоматически устанавливает свойство, которое объявляется как идентификатор BSON модели.

Если объявлено следующим образом ...

[BsonId]
public ObjectId Id { get; set; }

... тогдаПоле Id будет содержать идентификатор BSON по умолчанию (новый, уникальный) объекта после вставки объекта в коллекцию:

coll.Insert(obj);
// obj.Id is now the BSON ID of the object
14 голосов
/ 14 декабря 2012

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

Так что если

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
});
4 голосов
/ 26 июля 2017

Как указано выше, добавьте идентификатор файла в вашу модель с помощью

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

, используя:

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

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

0 голосов
/ 04 июня 2019

Я преобразую пользовательский тип T в BsonDocument перед его сохранением.

var bsonDocument = item.ToBsonDocument();
_mongoCollection.InsertOne(bsonDocument);

T имеет идентификатор свойства:

[BsonId]
public ObjectId Id { get; set; }

Когда я вызываюToBsonDocument(), поле Id заполняется ObjectId, который передается в БД Mongo.

Он создает сам Id в коде вместо делегирования БД Mongo для его создания.Но этого достаточно для моего случая.

0 голосов
/ 01 марта 2018

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

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>();

Тем не менее, вы должны иметь выделенное свойство каквыбранный ответ ...

...