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

Запрос MongoDB Использование 'ObjectId'

Я вставил document в MongoDB без id. И я хочу получить их, выполнив поиск MongoDB ObjectId, который был присвоен по умолчанию.

Вот моя попытка -

var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153");
var entity = dbCollection.FindOne(query_id);
return entity.ToString();

И я получаю следующую ошибку -

Произошла первая случайная ошибка типа "System.NullReferenceException"

В чем проблема?

4b9b3361

Ответ 1

Вам нужно создать экземпляр ObjectId, а затем выполнить запрос с использованием этого экземпляра, иначе ваш запрос сравнит ObjectId с строкой и не сможет найти соответствующие документы.

Это должно работать:

var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.FindOne(query_id);
return entity.ToString();

Ответ 2

В С# для последнего официального MongoDB.Driver напишите это -

var filter_id = Builders<MODEL_NAME>.Filter.Eq("id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.Find(filter).FirstOrDefault();
return entity.ToString();

Мы можем выполнить тот же результат без преобразования id из строки в ObjectId. Но тогда нам придется добавить [BsonRepresentation(BsonType.ObjectId)] до атрибута id в классе модели.

Код можно еще упростить с помощью выражения лямбда -

var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault();
return entity.ToString();

Ответ 3

Выбранный ответ правильный. Для любого, смущенного Query.EQ, вот еще один способ написать базовое обновление (обновляет весь документ mongodb):

string mongoDocumentID = "123455666767778";
var query = new QueryDocument("_id", ObjectId.Parse(mongoDocumentID)); 
var update = new UpdateDocument { { "$set", documentToSave } };
mongoCollection.Update(query, update, UpdateFlags.Multi);

Объект ObjectId необходим, когда вы хотите фактически искать по ID объекта, иначе он сравнивает строку с типом objectid и не будет соответствовать. Mongo очень строгий в этом отношении, независимо от того, правильно ли указано имя поля.