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.