Запрос 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"
В чем проблема?
Ответы
Ответ 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 очень строгий в этом отношении, независимо от того, правильно ли указано имя поля.