특정필드 필드별로 MongoDB 집계가 존재합니다.




몽고db_id (3)

나는 어제 밤 같은 문제를 다음과 같이 풀었다.

> db.test.aggregate({$group:{_id:{$gt:["$field", null]}, count:{$sum:1}}})
{ "_id" : true, "count" : 2 }
{ "_id" : false, "count" : 2 }

이것이 어떻게 작동하는지에 대한 전체 설명은 http://docs.mongodb.org/manual/reference/bson-types/#bson-types-comparison-order 를 참조 http://docs.mongodb.org/manual/reference/bson-types/#bson-types-comparison-order .

나는이 질문이 이미 물어 보지 않았고 어딘가에 답변을했다고 믿기가 힘들지만, 나는 그 어떤 흔적도 찾을 수 없다.

내가 부울로 그룹화해야 MongoDB 집합 쿼리가 : 다른 필드의 존재.

예를 들어이 컬렉션부터 시작해 보겠습니다.

> db.test.find()
{ "_id" : ObjectId("53fbede62827b89e4f86c12e"),
  "field" : ObjectId("53fbede62827b89e4f86c12d"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee002827b89e4f86c12f"), "name" : "Erik" }
{ "_id" : ObjectId("53fbee092827b89e4f86c131"),
  "field" : ObjectId("53fbee092827b89e4f86c130"), "name" : "John" }
{ "_id" : ObjectId("53fbee122827b89e4f86c132"), "name" : "Ben" }

2 개의 문서에는 "필드"가 있고 2 개의 문서에는 "필드"가 없습니다. "field"의 각 값은 다를 수 있습니다. 우리는 단지 그것의 존재를 그룹화하기를 원합니다. (또는 나도 널 값을 쓰지 않는 작품이 나도 null 값을 저장하지 않습니다.)

나는 $ project를 사용해 보았지만 $ exists는 거기에 존재하지 않고 $ cond와 $ ifNull은 나를 도왔다. 필드는 항상 존재하지 않는 것처럼 보입니다.

> db.test.aggregate(
  {$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}},
  {$group:{_id:"$fieldExists", count:{$sum:1}}}
)
{ "_id" : true, "count" : 4 }

다음과 같은 훨씬 간단한 집계가 작동 할 것이라고 기대할 수 있습니다. 그러나 어떤 이유로 든 $ exists는 이런 식으로 지원되지 않습니다.

> db.test.aggregate({$group:{_id:{$exists:"$field"}, count:{$sum:1}}})
assert: command failed: {
  "errmsg" : "exception: invalid operator '$exists'",
  "code" : 15999,
  "ok" : 0
} : aggregate failed
Error: command failed: {
  "errmsg" : "exception: invalid operator '$exists'",
  "code" : 15999,
  "ok" : 0
} : aggregate failed
    at Error (<anonymous>)
    at doassert (src/mongo/shell/assert.js:11:14)
    at Function.assert.commandWorked (src/mongo/shell/assert.js:244:5)
    at DBCollection.aggregate (src/mongo/shell/collection.js:1149:12)
    at (shell):1:9
2014-08-25T19:19:42.344-0700 Error: command failed: {
  "errmsg" : "exception: invalid operator '$exists'",
  "code" : 15999,
  "ok" : 0
} : aggregate failed at src/mongo/shell/assert.js:13

누구든지이 같은 컬렉션에서 원하는 결과를 얻는 방법을 알고 있습니까?

예상 결과:

{ "_id" : true, "count" : 2 }
{ "_id" : false, "count" : 2 }

나는 정의되지 않은 것을 확인하면서 그것을 해결했다.

$ne : [$var_to_check, undefined]

또는

$ne:  [ { $type : "$var_to_check"}, 'missing'] }

var가 정의되어 있으면 true를 반환합니다.


$exists 연산자는 "쿼리"연산자이므로 기본적으로 논리 조건을 식별하는 대신 결과를 "필터링"하는 데 사용됩니다.

"논리적"연산자로서 집계 프레임 워크는 $ifNull 연산자를 지원합니다. 이것은 존재하는 필드 치를 돌려줍니다. 그렇지 않은 경우, 또는 null 평가되는 곳의 대체 제공 치를 돌려 null

db.test.aggregate([
    { "$group": {
        "_id": { "$ifNull": [ "$field", false ] },
        "count": { "$sum": 1 }
    }}
])

그러나 물론 "true / false"비교가 아니기 때문에 실제로 필드의 실제 값을 반환하지 않으면 다음과 같이 $cond 문을 사용하는 것이 좋습니다.

db.test.aggregate([
    { "$group": {
        "_id": { "$cond": [{ "$eq": [ "$field", null ] }, true, false ] },
        "count": { "$sum": 1 }
    }}
])

$ifNull 이 매우 유용 할 수있는 곳은 존재하지 않는 배열 필드를 바꾸는 것이다. 그렇지 않으면 $unwind 사용하여 에러를 일으킬 것이다. 그런 다음 단일 요소 또는 빈 배열 반환과 같은 작업을 수행하여 파이프 라인 처리의 나머지 부분에서 문제가 발생하지 않도록 할 수 있습니다.







aggregation-framework