sharp por net example consultas consulta conectar con c# .net mongodb mongodb-.net-driver

por - mongodb c# example



Consulta MongoDB utilizando ''ObjectId'' (5)

He insertado document s en MongoDB sin una id . Y quiero recuperarlos buscando en su ObjectId MongoDB , que se ha asignado de forma predeterminada .

Aquí está mi intento-

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

Y me sale siguiente error-

Se produjo una primera excepción de oportunidad del tipo ''System.NullReferenceException''

¿Cuál es el problema?


Debe crear una instancia de ObjectId y luego consultar utilizando esa instancia; de lo contrario, su consulta compara ObjectId s con cadenas y no encuentra documentos que coincidan.

Esto debería funcionar:

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


En C # para el último MongoDB.Driver oficial escribe esto-

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

Podemos lograr el mismo resultado sin convertir id de string a ObjectId . Pero entonces, tendremos que agregar [BsonRepresentation(BsonType.ObjectId)] antes del atributo id en la clase del modelo.

El código puede incluso simplificarse aún más usando la expresión lambda -

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


La respuesta seleccionada es correcta. Para cualquier persona confundida por Query.EQ, aquí hay otra forma de escribir una actualización básica (actualiza todo el documento mongodb):

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

El objeto ObjectId es necesario cuando realmente desea buscar por ID de objeto, de lo contrario está comparando la cadena con el tipo de id de objeto y no coincidirá. Mongo es muy estricto con este tipo, independientemente de si el nombre del campo es correcto.


Si está aquí en 2018 y desea copiar / pegar código que aún funciona o sintaxis de cadena pura;

[Fact] public async Task QueryUsingObjectId() { var filter = Builders<CosmosParkingFactory>.Filter.Eq("_id", new ObjectId("5b57516fd16cb04bfc35fcc6")); var entity = stocksCollection.Find(filter); var stock = await entity.SingleOrDefaultAsync(); Assert.NotNull(stock); var idString = "5b57516fd16cb04bfc35fcc6"; var stringFilter = "{ _id: ObjectId(''" + idString + "'') }"; var entityStringFiltered = stocksCollection.Find(stringFilter); var stockStringFiltered = await entityStringFiltered.SingleOrDefaultAsync(); Assert.NotNull(stockStringFiltered); }


También puedes hacerlo de esta manera, su

public static ObjectId GetInternalId(string id) { if (!ObjectId.TryParse(id, out ObjectId internalId)) internalId = ObjectId.Empty; return internalId; }

Entonces en tu método puedes hacer algo como esto

ObjectId internalId = GetMongoId.GetInternalId(id); return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync();

Nota: id param en GetInternalId es un parámetro en ese método. En caso de necesitarlo como este:

public async Task<YourTable> Find(string id) { ObjectId internalId = GetMongoId.GetInternalId(id); return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync(); }

Espero que ayude también.