programing

MongoDB: 비어 있지 않은 문서 배열과 일치

kingscode 2023. 5. 21. 14:50
반응형

MongoDB: 비어 있지 않은 문서 배열과 일치

컬렉션은 다음과 같이 구성되어 있습니다.

{
  _id: 1,
  score: [
    {
      foo: 'a',
      bar: 0,
      user: {user1: 0, user2: 7}
    }
  ]
}

특정 값이 'bar'인 'score'(점수 배열의 요소)와 비어 있지 않은 'user' 하위 문서가 하나 이상 있는 모든 문서를 찾아야 합니다.

이것이 바로 제가 생각해 낸 것입니다(그리고 그것이 효과가 있어야 할 것 같았습니다).

db.col.find({score: {"$elemMatch": {bar:0, user: {"$not":{}} }}})

그러나 다음 오류가 발생했습니다.

error: { "$err" : "$not cannot be empty", "code" : 13030 }

다른 방법은 없나요?

이해했습니다.{ 'score.user': { "$gt": {} } }비어 있지 않은 문서와 일치합니다.

당신의 스키마를 잘 이해할 수 있을지 모르겠지만, 아마도 가장 간단한 방법은 score.user에 대해 "빈" 값을 갖지 않는 것일 것입니다.

대신 문서에 내용이 없는 경우 해당 필드를 문서에 포함하지 않으시겠습니까?

그렇다면 당신의 질문은 다음과 같은 것일 수 있습니다.

> db.test.find({ "score" : { "$elemMatch" : { bar : 0, "user" : {"$exists": true }}}})

즉, score.bar 에서 원하는 값을 찾습니다(이 경우 0). score.user의 미어 존재를 확인합니다($165, 문서 참조). (값이 있으면 존재합니까?).)

편집: 웁스, 당신이 가지고 있던 $elemMatch를 놓쳤습니다...

의 사용자를 추적하는 보조 배열을 추가할 수 있습니다.user문서:

{
  _id: 1,
  score: [
    {
      foo: 'a',
      bar: 0,
      users: ["user1", "user2"],
      user: {user1: 0, user2: 7}
    }
  ]
}

그런 다음 새 사용자를 원자적으로 추가할 수 있습니다.

> db.test.update({_id: 1, score: { $elemMatch: {bar: 0}}},                       
... {$set: {'score.$.user.user3': 10}, $addToSet: {'score.$.users': "user3"}})

사용자 제거:

> db.test.update({_id: 1, score: { $elemMatch: {bar: 0}}},
... {$unset: {'score.$.user.user3': 1}, $pop: {'score.$.users': "user3"}})      

쿼리 점수:

> db.test.find({_id: 1, score: {$elemMatch: {bar: 0, users: {$not: {$size: 0}}}}})

존재하지 않는 사용자만 추가하고 기존 사용자는 에서 제거합니다.user문서, 단순화할 수 있습니다.users배열 대신 카운터로 이동하지만 위의 항목이 더 탄력적입니다.

배열 크기를 확인하려면 $size 연산자를 확인합니다.

 $group: {
        _id: '$_id',
        tasks: {
          $addToSet: {
            $cond: {
              if: {
                $eq: [
                  {
                    $ifNull: ['$tasks.id', ''],
                  },
                  '',
                ],
              },
              then: '$$REMOVE',
              else: {
                id: '$tasks.id',
                description: '$tasks.description',
                assignee: {
                  $cond: {
                    if: {
                      $eq: [
                        {
                          $ifNull: ['$tasks.assignee._id', ''],
                        },
                        '',
                      ],
                    },
                    then: undefined,
                    else: {
                      id: '$tasks.assignee._id',
                      name: '$tasks.assignee.name',
                    },
                  },
                },
              },
            },
          },
        },

언급URL : https://stackoverflow.com/questions/6607102/mongodb-match-non-empty-doc-in-array

반응형