programing

$exists가 $cond 내에 있는 조건부 그룹화

bestprogram 2023. 3. 18. 09:30

$exists가 $cond 내에 있는 조건부 그룹화

나는 A와 B의 두 개의 키를 가지고 있으며, 그 두 키는 서로 배타적이다.A가 있을 때는 A로, B가 있을 때는 B로 그룹화해야 합니다.그래서 나는$project필요한 값을 MyKey라고 하는 컴퓨터 키에 입력해, 이 키에 필요한 값을 입력합니다.$group하지만 구문을 잘못 알고 있는 것 같습니다.$프로젝트를 두 가지 방법으로 작성하려고 했습니다.

{$project: {MyKey: {$cond: [{$exists: ["$A", true]}, "$A", "$B"]}}}

그리고.

{$project: {MyKey: {$cond: [{"A": {$exists:true}}, "$A", "$B"]}}}

하지만 계속 오류가 발생합니다.

{ "errmsg" : "exception: invalid operator '$exists'", "code" : 15999, "ok" : 0 } ...

뭐가 잘못됐어?

대신 사용$cond당신의 안에서$project:

{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}

한다면A존재하는지 여부null그 값이 사용됩니다.그렇지 않으면, 그 값은B사용됩니다.

$cond로 $120을 체크하고 싶다면 $cond로 체크하지 말고 $cond로 체크하는 것이 대체 방법입니다.

{$project: {MyKey: {$cond: [{$not: ["$A"]}, "$B", "$A"]}}} 

$not에 대한 진실 표는 다음과 같습니다.

여기에 이미지 설명 입력

도움이 되는 희망

다음과 같은 방법으로 존재 여부를 시뮬레이션할 수 있습니다.

$ne : [$var_to_check, undefined]

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

$cond 및 체크에서 찾은 공유가 있습니다.

$cond: {
  if: "$A1",
  then: "$A1",
  else: "$B1"
}

비슷한 문제를 찾다가 당신의 질문을 발견했는데, 키를 꽂고 파라미터를 찾고 있었습니다.나는 마침내 그 문제를 해결했다.

이것은 $_id.status 파라미터에 사용한 것입니다.이 파라미터는 조건 내에 존재하는지 확인하기 위해서입니다.

$cond: [{
     $or: [{
          $ne: ["$_id.status", null]
     }]
}, 1, null]

또는 $는 필요 없습니다.내가 보관하고 있어...그냥 재미로.현재로선 질의에 큰 영향을 주지 않는 것 같습니다.나중에 속도 테스트를 하겠습니다.

TL;DR:

기대했던 것과 완전히 동등한 것{ k: { $exists: true } }집합적으로 또는$expr다음 방법으로 스테이트먼트를 실행할 수 있습니다.{ $or: ['$k', { $in: ['$k', [null, 0, false]] }] }

설명:

필드 값과의 비교null사용.$eq또는$in는 엄격하며 필드가 설정되지 않으면 false를 반환합니다.

이에 대한 진실 표는 다음과 같습니다.

                        | null  | unset | truthy | falsy |
------------------------+-------+-------+--------+-------+
{ $eq: ['$k', null] }   | TRUE  | FALSE | FALSE  | FALSE |
{ $in: ['$k', [null]] } | TRUE  | FALSE | FALSE  | FALSE |

따라서 필드가 언제 설정되었는지 알기 위해서는 테이블의 truthy 과 false 열을 다음과 같이 전환해야 합니다.true.

단조로운 값은... 단조롭기 때문에 그대로 사용할 수 있습니다.{ $or: ['$k', { $eq: ['$k', null] }] }

MongoDB에서 false 값은 다음과 같습니다.0,false그리고.null그래서 우리는 잃어버린 것들을 우리 회사에 추가할 수중에 넣을 수 있습니다.$in절:{ $in: ['$k', [null, 0, false]] }

이것들을 합치면, 우리는 다음을 얻을 수 있다.{ $or: ['$k', { $in: ['$k', [null, 0, false]] }] }이제 돌아올 것이다.true만약 필드가 진부하거나,0,false또는null그리고.false설정되지 않은 경우.

언급URL : https://stackoverflow.com/questions/14213636/conditional-grouping-with-exists-inside-cond