Saltar al contenido

Cómo encontrar el valor mínimo en mongodb

Nuestros investigadores estrellas agotaron sus depósitos de café, en su búsqueda noche y día por la resolución, hasta que Linda halló la contestación en GitHub por lo tanto hoy la comparte contigo.

Solución:

Puedes usar una combinación de sort y limit emular min:

> db.foo.insert(a: 1)
> db.foo.insert(a: 2)
> db.foo.insert(a: 3)
> db.foo.find().sort(a: 1).limit(1) 
 "_id" : ObjectId("4df8d4a5957c623adae2ab7e"), "a" : 1 

sort(a: 1) es una ordenación ascendente (mínimo-primero) en el a campo, y luego solo devolvemos el primer documento, que será el valor mínimo para ese campo.

EDITAR: tenga en cuenta que esto está escrito en el shell de mongo, pero puede hacer lo mismo desde C# o cualquier otro idioma usando los métodos de controlador apropiados.

El primero

  db.sales.insert([
     "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") ,
     "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") ,
     "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") ,
     "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") ,
     "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:05:00Z") 
  ])

El segundo, encuentra el valor mínimo.

  db.sales.aggregate(
   [
     
       $group:
       
         _id: ,
         minPrice:  $min: "$price" 
       
     
   ]
  );

el resultado es

 "_id" :   , "minPrice" : 5 

También puede usar la función min como esta.

 db.sales.aggregate(
    [
      
        $group:
        
          _id: "$item",
          minQuantity:  $min: "$quantity" 
        
      
    ]
  )

resultado son

 "_id" : "xyz", "minQuantity" : 5 
 "_id" : "jkl", "minQuantity" : 1 
 "_id" : "abc", "minQuantity" : 2 

$min es un operador acumulador disponible solo en la fase de grupos de $.

ACTUALIZAR:
Modificado en la versión 3.2: $min está disponible en las etapas $group y $project. En versiones anteriores de MongoDB, $min solo está disponible en la etapa de grupos de $.

haga clic aquí para obtener más ayuda

Solo quiero mostrar cómo se puede hacer con el controlador c# oficial (desde la pregunta sobre mongodb csharp) con una mejora: estoy cargando solo un campo, pero no el documento completo si solo quiero encontrar el valor mínimo de ese campo. Aquí está el caso de prueba completo:

[TestMethod]
public void Test()

  var _mongoServer = MongoServer.Create("mongodb://localhost:27020");
  var database = _mongoServer.GetDatabase("StackoverflowExamples");
  var col = database.GetCollection("items");

  //Add test data
  col.Insert(new Item()  IntValue = 1, SomeOtherField = "Test" );
  col.Insert(new Item()  IntValue = 2 );
  col.Insert(new Item()  IntValue = 3 );
  col.Insert(new Item()  IntValue = 4 );

  var item = col.FindAs(Query.And())
  .SetSortOrder(SortBy.Ascending("IntValue"))
  .SetLimit(1)
  .SetFields("IntValue") //here i loading only field that i need
  .Single();
  var minValue = item.IntValue;

  //Check that we found min value of IntValue field
  Assert.AreEqual(1, minValue);
  //Check that other fields are null in the document
  Assert.IsNull(item.SomeOtherField);
  col.RemoveAll();
 

Y Item clase :

public class Item

   public Item()
   
     Id = ObjectId.GenerateNewId();
   

    [BsonId]
    public ObjectId Id  get; set; 
    public int IntValue  get; set; 
    public string SomeOtherField  get; set; 

Actualizar: Siempre tratando de avanzar más, así que aquí está el método de extensión para encontrar el valor mínimo dentro de la colección:

public static class MongodbExtentions

    public static int FindMinValue(this MongoCollection collection, string fieldName)
    
        var cursor = collection.FindAs(Query.And())
                     .SetSortOrder(SortBy.Ascending(fieldName))
                     .SetLimit(1)
                     .SetFields(fieldName);

        var totalItemsCount = cursor.Count();

        if (totalItemsCount == 0)
            throw new Exception("Collection is empty");

        var item = cursor.Single();

        if (!item.Contains(fieldName))
            throw new Exception(String.Format("Field '0' can't be find within '1' collection", fieldName, collection.Name));

        return item.GetValue(fieldName).AsInt32; // here we can also check for if it can be parsed
    

Entonces, el caso de prueba anterior con este método de extensión se puede reescribir así:

[TestMethod]
public void Test()

  var _mongoServer = MongoServer.Create("mongodb://localhost:27020");
  var database = _mongoServer.GetDatabase("StackoverflowExamples");
  var col = database.GetCollection("items");

  var minValue = col.FindMinValue("IntValue");

  Assert.AreEqual(1, minValue);
  col.RemoveAll();

Espero que alguien lo use;).

Si haces scroll puedes encontrar las acotaciones de otros creadores, tú todavía tienes la libertad de dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *