mongodb에서 최소값을 찾는 방법
다음과 같은 작업을 어떻게 수행합니까?
SELECT
MIN(Id) AS MinId
FROM
Table
MongoDB와 함께?
MapReduce를 사용해야 할 것으로 보이지만 이 방법을 보여주는 예를 찾을 수 없습니다.
다음의 조합을 사용할 수 있습니다.sort
그리고.limit
본받다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})
의 오름차순(최소 우선) 정렬입니다.a
필드를 선택한 다음 첫 번째 문서만 반환합니다. 이 문서는 해당 필드의 최소값이 됩니다.
편집: 이것은 mongo 셸에 기록되어 있지만 C# 또는 다른 언어에서도 적절한 드라이버 방법을 사용하여 동일한 작업을 수행할 수 있습니다.
첫번째
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") }
])
둘째, 최소값 찾기
db.sales.aggregate(
[
{
$group:
{
_id: {},
minPrice: { $min: "$price" }
}
}
]
);
결과는
{ "_id" : { }, "minPrice" : 5 }
이와 같이 min 기능을 사용할 수도 있습니다.
db.sales.aggregate(
[
{
$group:
{
_id: "$item",
minQuantity: { $min: "$quantity" }
}
}
]
)
결과는
{ "_id" : "xyz", "minQuantity" : 5 }
{ "_id" : "jkl", "minQuantity" : 1 }
{ "_id" : "abc", "minQuantity" : 2 }
$min은 $그룹 단계에서만 사용할 수 있는 누적 연산자입니다.
업데이트: 버전 3.2에서 변경됨: $min은 $group 및 $project 단계에서 사용할 수 있습니다.이전 버전의 MongoDB에서는 $min을 $group 단계에서만 사용할 수 있습니다.
mongodbcsharp에 대한 질문 이후 공식적인 c# 드라이버로 어떻게 할 수 있는지 한 가지 개선을 통해 보여주고 싶습니다. 저는 하나의 필드만 로드하고 있고, 그 필드의 최소값만 찾으려면 전체 문서는 로드하지 않습니다.다음은 전체 테스트 사례입니다.
[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<Item>(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();
}
그리고.Item
클래스 :
public class Item
{
public Item()
{
Id = ObjectId.GenerateNewId();
}
[BsonId]
public ObjectId Id { get; set; }
public int IntValue { get; set; }
public string SomeOtherField { get; set; }
}
업데이트: 항상 더 멀리 이동하려고 하므로 컬렉션 내에서 최소값을 찾기 위한 확장 방법은 다음과 같습니다.
public static class MongodbExtentions
{
public static int FindMinValue(this MongoCollection collection, string fieldName)
{
var cursor = collection.FindAs<BsonDocument>(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
}
}
따라서 이 확장 방법을 사용하는 위의 테스트 사례는 다음과 같이 다시 작성할 수 있습니다.
[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();
}
누군가 그것을 사용하기를 바랍니다 ;).
언급URL : https://stackoverflow.com/questions/6360465/how-to-find-min-value-in-mongodb
'programing' 카테고리의 다른 글
이클립스:선언된 패키지가 예상된 패키지와 일치하지 않습니다. (0) | 2023.05.05 |
---|---|
웹 응용 프로그램에 대한 IIS7 폴더 사용 권한 (0) | 2023.05.05 |
개인 저장소 복제(Github) (0) | 2023.05.05 |
요소를 수평으로 중앙에 배치하려면 어떻게 해야 합니까? (0) | 2023.05.05 |
List는 삽입 순서를 보장합니까? (0) | 2023.05.05 |