2012-12-19 4 views
3

목록의 전체 내용을 검색하지 않고 각 문서의 배열 길이를 가져 오는 mongo 쿼리를 수행하려고합니다. 이상적으로는 다음 행에 따라 투영 옵션을 지정하는 것이 이상적입니다.MongoDB에서 목록의 길이 검색하기

db.log.find({},{entries:{$length: 1}}) 

그러나 이것은 지원되지 않습니다. 새 집계 프레임 워크를 사용하여 우아한 방식으로이 작업을 수행 할 수 있습니까? 이 같은 결과를 반환

db.log.find({},{"entries.length": 1}) 

: 내가 가지고 올 한 것은 이것이다

{ "_id" : ObjectId("50d2fb07e64cfa55431de693"), "entries" : [ { },  { },  { },  { },  { },  { },  { },  { }, { },  { },  { },  { },  { },  { }, { },  { },  { },  { } ] } 

이 못생긴하지만 네트워크없이이리스트의 길이를 계산 할 수 있기 때문에 기본적으로 내 요구를 제공 전체 내용을 가져 오는 무게. 그러나 나는 이것이 왜 작동하는지 전혀 모른다. 실제로이 쿼리는 무엇입니까?

+0

을 -이 아마도 그들 중 설정되지 않기 때문에 배열의 각 요소에 대해 빈 객체를 얻습니다. – drevicko

답변

5

지금, 나는이 approachs에서 생각할 수 : 통합 프레임 워크를 사용

1) :

db.log.aggregate([ { $unwind : "$entries" }, { $group : { _id : "$_id", entries : {$sum:1} } } ]); 

2) 아니면 항목이 계산 보유하고 문서에 필드를 추가 할 수 있습니다. 따라서 새로운 값을 입력 배열로 보낼 때마다 카운터를 증가시켜야합니다. 이 업데이트는 다음과 같이 될 것입니다 :

db.log.update({ _id : 123 }, { $push : { entries : 'value' }, $inc : { entriesCount : 1 } }) 

은 분명히 여기에 트레이드 오프가 있습니다 집계 프레임 워크는이 간단한 조작을 위해 너무 비싸다. 문서에 필드를 추가하면 모든 업데이트가 카운터를 증가시켜야합니다.

IMHO의 경우 카운터가 더 적당 해 보이지만 해결 방법이 보입니다.

1

According to the mongodb documentation:

당신은뿐만 아니라 $ 크기 사용할 수 있습니다 : 나는 배열의 각 요소의`length` 필드를 반환 믿을

db.log.aggregate([{$project:{'_id':1, 'count':{$size: "$entriesCount"}}}]);