He insertado documents en MongoDB sin un id. Y quiero recuperarlos mediante la búsqueda a través de sus MongoDB ObjectId, que ha sido asignado en defecto.

Aquí está mi intento de

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

Y me sale error siguiente

Una primera oportunidad excepción del tipo ‘System.NullReferenceException’ se ha producido

¿Cuál es el problema?

InformationsquelleAutor Mike Barnes | 2013-01-14

5 Comentarios

  1. 52

    Necesita crear una instancia de ObjectId y, a continuación, consulta el uso de esa instancia, de lo contrario su consulta compara ObjectIds a la cadena y no encontrar documentos coincidentes.

    Esto debería funcionar:

    var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
    var entity = dbCollection.FindOne(query_id);
    return entity.ToString();
    • Esta respuesta es casi correcta. Al menos en C#, parece que ya no hay un FindOne() método. Reemplazar con FindOneAs() en su lugar. Aquí hay un enlace a un buen ejemplo, esta usa FindAs(), pero es el mismo principio: stackoverflow.com/a/12345580/2705003
    • Hay ahora ya no es un FineAs o FindOneAs método, Minhas Kamal respuesta debe ser que se hace referencia en lugar
  2. 23

    En C# para la última oficial MongoDB.Controlador de escribir este-

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

    Podemos conseguir el mismo resultado sin necesidad de convertir id de la cadena de ObjectId. Pero entonces, tendremos que añadir [BsonRepresentation(BsonType.ObjectId)] antes de id atributo en la clase del modelo.

    El código puede ser incluso más simplificado con el uso de expresión lambda

    var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault();
    return entity.ToString();
    • En ObjectId.Parse(cool_id.ToString()) siento constantemente que el guid es «no válido 24 dígitos hex string» – qué estoy haciendo mal?
  3. 2

    La respuesta seleccionada es correcta. Para cualquiera que esté confundido por la Consulta.EQ, aquí es otra forma de escribir una actualización básica (actualizaciones de toda la mongodb documento):

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

    El id de objeto del objeto es necesaria cuando se desea buscar por ID de objeto, de lo contrario se está comparando la cadena de objectid tipo, y no de partido. Mongo es muy de tipo estricto de esta manera, independientemente de si el nombre de campo es correcta.

  4. 2

    Si estás aquí en 2018 y quieren copiar/pegar el código que todavía funciona o pura sintaxis de la cadena;

        [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);
        }
  5. 0

    También puede hacerlo de esta manera, su

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

    a continuación, en su método, se puede hacer algo como esto

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

    Nota: id param en GetInternalId de un parámetro en el método. En caso de que usted necesita 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.

Dejar respuesta

Please enter your comment!
Please enter your name here