필드별 MongoDB Aggregate가 존재합니다.
저는 이 질문이 어디선가 아직 나오지 않았다는 것을 믿기 어렵지만, 그 흔적을 찾을 수 없습니다.
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개는 없습니다."필드"의 각 값은 다를 수 있습니다.그 존재에 따라 그룹화하고 싶을 뿐입니다(또는 null이 아닌 값은 저장되지 않았습니다).
$프로젝트를 사용하려고 했지만 $exists는 존재하지 않으며 $cond와 $ifNull은 도움이 되지 않습니다.필드가 존재하지 않는 경우에도 항상 존재하는 것으로 나타납니다.
> db.test.aggregate(
{$project:{fieldExists:{$cond:[{$eq:["$field", null]}, false, true]}}},
{$group:{_id:"$fieldExists", count:{$sum:1}}}
)
{ "_id" : true, "count" : 4 }
다음과 같은 훨씬 단순한 Aggregate가 작동하기를 기대하지만, 어떤 이유로 $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 }
어젯밤에도 같은 문제를 해결했어요. 이런 식으로요.
> 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-types-intersion-order 를 참조해 주세요.
코멘트 섹션 추가:
값이 존재하지 않거나 null 사용인지 확인하는 방법{ $lte: ["$field", null] }
정의되지 않은 것을 확인하면서 해결했다.
$ne : [$var_to_check, undefined]
또는
$ne: [ { $type : "$var_to_check"}, 'missing'] }
var가 정의되어 있으면 true가 반환됩니다.
연산자는 "쿼리" 연산자이므로 기본적으로 논리 조건을 식별하는 대신 결과를 "필터링"하는 데 사용됩니다.
"논리적인" 연산자로서 집계 프레임워크는 연산자를 지원합니다.필드 값이 존재하는 경우 또는 값이 평가되지 않는 경우 또는 그렇지 않은 경우 제공된 대체 값이 반환됩니다.null
db.test.aggregate([
{ "$group": {
"_id": { "$ifNull": [ "$field", false ] },
"count": { "$sum": 1 }
}}
])
그러나 물론 이마저도 "참/거짓" 비교가 아니기 때문에 실제로 값이 존재하는 필드의 실제 값을 반환하지 않는 한 다음과 같은 문장이 더 나을 수 있습니다.
db.test.aggregate([
{ "$group": {
"_id": { "$cond": [{ "$eq": [ "$field", null ] }, true, false ] },
"count": { "$sum": 1 }
}}
])
를 사용하지 않으면 오류가 발생할 수 있는 존재하지 않는 배열 필드를 교체하는 것이 매우 유용합니다.그런 다음 단일 요소나 빈 배열을 반환하여 파이프라인 처리의 나머지 부분에서 문제가 발생하지 않도록 할 수 있습니다.
어땠는지 모르겠지만 2019년에는 깨끗한 해결책이 있습니다.집약 파이프라인에서 다음을 수행합니다.
$match: {"my_field": {$ne: null}}
좋은 것은 내 언어 안에 있다'ne'는 그렇지 않다는 뜻이다:)
요컨대
{'$project': {
'field_exists': {'$or': [
{'$eq': ['$field', null]},
{'$gt': ['$field', null]},
]},
}}
세부 사항
$exists
필드는 합니다.null
또는 다른 빈 값을 지정합니다.그래서 이 페이지의 모든 답이 틀렸습니다.
조금만 테스트해 봅시다.체크해 주세요.
// Let's take any collection that have docs
db.getCollection('collection').aggregate([
// Get arbitrary doc, no matter which, we won't use it
{"$limit": 1},
// Project our own fields (just create them with $literal)
{'$project': {
'_id': 0,
'null_field': {'$literal': null},
'not_null_field': {'$literal': {}},
}},
])
다음과 같은 결과가 있습니다.
{
"null_field" : null,
"not_null_field" : {}
}
다음으로 이 문서에 존재하는 필드를 명확히 합니다.
null_field
not_null_field
non_existent_field
않아 - 그렇지 않아
자, 이제 위에서 언급한 프로젝트 단계를 테스트해 보겠습니다.관심 있는 모든 분야에 대해 추가하겠습니다.
{'$project': {
'null_field_exists': {'$or': [
{'$eq': ['$null_field', null]},
{'$gt': ['$null_field', null]},
]},
'not_null_field_exists': {'$or': [
{'$eq': ['$not_null_field', null]},
{'$gt': ['$not_null_field', null]},
]},
'non_existent_field_exists': {'$or': [
{'$eq': ['$non_existent_field', null]},
{'$gt': ['$non_existent_field', null]},
]},
}},
결과는 다음과 같습니다.
{
"null_field_exists" : true,
"not_null_field_exists" : true,
"non_existent_field_exists" : false
}
정답!
그리고 작은 메모: 우리는null
최소 값이기 때문에 비교하기 위한 것입니다(단순한 값은 비표준 값입니다).
작업 후에만 mongoose에서
$ne: [ { $type : "$var_to_check"}, 'missing'] }
필드가 존재하며 늘이 아닌지 확인하는 의미론적으로 투명한 솔루션:
{ $ne: [{ $ifNull: ["$field", null] }, null] }
되지 않았는지 , 을 합니다.$ne
$eq
.
$addFields와 $ifNull을 사용하여 해결한 후 값이 null인지 확인함으로써 추가된 필드를 $match했습니다.
collection.aggregate(
[
{
$addFields:{
fieldName:{
$ifNull:["$fieldToCheckIfExists", null]
}
}
},
{
$match:{
fieldName:{
$ne: null
}
}
]
답변은 다음과 같습니다.
{$match:{
$and:[{
name:{
$exists:true
}
}, {
$expr:{
$eq:["$$id", "$_id"]
}
}]
}}
파이프라인 스테이지에서 조회할 때 사용합니다.이 게시물 2는 첫 번째 게시물을 규정합니다. 이름은 존재해야 합니다.그리고 두 번째는 이 두 컬렉션의 관계입니다.당신의 질문에 대해 이것을 수정할 수 있다고 확신합니다.
그룹에서 기존 필드를 카운트하고 싶지만 다른 답변과 같이 그룹화하지 않으려면 다음을 사용할 수 있습니다.
{
_id: "$groupField",
qtyExists: {
$sum: {
$cond: ["$field", 1, 0]
}
},
qtyNotExists: {
$sum: {
$cond: ["$field", 0, 1]
}
},
}
언급URL : https://stackoverflow.com/questions/25497150/mongodb-aggregate-by-field-exists
'sourcecode' 카테고리의 다른 글
angularjs - ng-switch가 ng-model을 바인드하지 않음 (0) | 2023.04.04 |
---|---|
각 서비스 함수에 $scope 삽입() (0) | 2023.04.04 |
휴지 상태 개체를 직렬화할 때 이상한 잭슨 예외가 발생함 (0) | 2023.04.04 |
javascript로 URL에 해시태그 첨부 (0) | 2023.04.04 |
인덱스로 JSON 개체의 속성을 검색하시겠습니까? (0) | 2023.04.04 |