Подтвердить что ты не робот

Получить _id вставленного документа в MongoDB?

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

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

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

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

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

4b9b3361

Ответ 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. Но этого достаточно для моего случая.