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.