Mongodb:쿼리의 크기는 중첩된 배열

0

질문

나는 다음과 같은 Schema:

Schema({
caller_address: {
    type: String,
    required: true,
},
traces: [[{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Call',
}]]

});

고 싶을 검색하만이 있는 객체적으로 통화를 양보다 더 큰 지정된 번호입니다. 에 다른 단어의 크기는 적어도 하나의 중첩된 배열의 흔적이 있어야 보다 더 큰 지정된 번호입니다. 내가 사용하려$elemMatch 및$크기,그러나 없는 성공이다. 지금,나는 이 코드:

CallerTraces.find({ 'traces' : { $elemMatch: { $size : { $gt: minTraceSize } }}})

는 minTraceSize int.

할 수 있었을까? 나는 정말로 감사합니다!

arrays mongodb nested
2021-11-23 20:27:28
1

최고의 응답

0

감사에 대한 샘플 데이터를 확보합니다. 내 대답이 될 것이 원 MQL 솔루션이 아니구스 솔루션,그래서 몇 가지로 번역이 필요합니다.

할 수 있었을 삽입하는 두 개의 문서에 따라 귀하의 의견이 당신의 게시물입니다. 했을 변경하는 모든 요청에 필의 한 두 가지의 샘플 문서기 때문에 당신의 샘플을 동일한 기본 키의 값을 생성하고 있었는 중복되어 있습니다.

샘플 데이터를 삽입

db.CallerTraces.insert(
{
  "_id": ObjectId("6175e7ecc62cff004462d4a6"),
  "traces": [
    [
      ObjectId("6175e7ecc62cff004462d4a4")
    ]
  ],
  "caller_address": "0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990"
})


db.CallerTraces.insert(
{
  "_id": ObjectId("6175e7ecc62cff004462d4a7"),
  "traces": [
    [
      ObjectId("6175e7ecc62cff004462d4a4"),
      ObjectId("6175e7ecc62cff004462d4a4")
    ],
    [
      ObjectId("6175e7ecc62cff004462d4a4")
    ]
  ],
  "caller_address": "0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990"
})

하고 싶다면 찾아 기록을 보다 더 0 품목에서 배열 traces 나는 문제는 다음과 같다:

찾아보다 더 영 추적

db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 0 ] } })

이 다음을 반환합니다:

Enterprise replSet [primary] barrydb> db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 0 ] } })
[
  {
    _id: ObjectId("6175e7ecc62cff004462d4a6"),
    traces: [ [ ObjectId("6175e7ecc62cff004462d4a4") ] ],
    caller_address: '0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990'
  },
  {
    _id: ObjectId("6175e7ecc62cff004462d4a7"),
    traces: [
      [
        ObjectId("6175e7ecc62cff004462d4a4"),
        ObjectId("6175e7ecc62cff004462d4a4")
      ],
      [ ObjectId("6175e7ecc62cff004462d4a4") ]
    ],
    caller_address: '0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990'
  }
]

을 찾을 1 개 이상의 추적

는 경우에 당신을 찾으려면 더 이상의 추적 나는 단순히 쿼리 변경이 약간:

db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 1 ] } })

...그리고 이와 함께 반환은 다음과 같은 결과를 생성합니다.

Enterprise replSet [primary] barrydb> db.CallerTraces.find({ $expr: { $gt: [ { $size: "$traces" }, 1 ] } })
[
  {
    _id: ObjectId("6175e7ecc62cff004462d4a7"),
    traces: [
      [
        ObjectId("6175e7ecc62cff004462d4a4"),
        ObjectId("6175e7ecc62cff004462d4a4")
      ],
      [ ObjectId("6175e7ecc62cff004462d4a4") ]
    ],
    caller_address: '0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990'
  }
]

결론

하려고 시도할 때을 평가하는 배열의 길이는 쿼리 내에서 프로세서리하도록 선택 사용 $eval 옵션에 대한 구문을 MQL 고려하지 않습니다. 이 $eval 은 약간의 catch-all 옵션에 대한되지 않는 것들에 잘 맞 MQL framework.

업데이트#1 OP 소개한 추가적인 요구 사항이 있습니다. 찾아보다 카운트에서의 배열을,우리가 고려해야 합 계산 배열의 배열 내에서(중첩된 내 편). 이후 찾을 수 있습니다()메소드와 함께$expr 을 평가할 중첩 배열해야 합 대신 사용하여 집계 프레임워크 및 여유를 즐 외부 배열입니다. 이 예는 저장하는 원래의 형태에 라는 새로운 분야 original 그런 다음 대체 후 뿌리는 모든 평가가 완료됩니다. 이후 해제할 수 있는 결과 중복 파이프라인에서 우리는 마무리와 함께$그룹을 억제하는 중복.

솔루션

db.CallerTraces.aggregate([
    {
        $addFields: {
            "original._id": "$_id",
            "original.traces": "$traces",
            "original.caller_address": "$caller_address"
        }
    },
    {
        $unwind: "$traces"
    },
    {
        $match: { $expr: { $gt: [ { $size: "$traces" }, 1 ] } }
    },
    {
        $replaceRoot: { newRoot: "$original" }
    },
    {
        $group:
        {
            _id: "$_id",
            traces: { "$first": "$traces" },
            caller_address: { "$first": "$caller_address" }
        }
    }
])
2021-11-24 21:42:44

안녕하세요,당신은 당신의 빠른 응답! 하지만 아직은 아니다 싶을 얻을 흔적이 크기에서 두 번째 수준의 중첩이 있습니다. 그래서,가 있는 경우:{"용할 수 있게 될 것이":개체 id("6175e7ecc62cff004462d4a7"),"traces":[[개체 id("6175e7ecc62cff004462d4a4"),개체 id("6175e7ecc62cff004462d4a4")]],"caller_address":"0x4e204793bc4b8acee32edaf1fbba1f3ea45f7990"})이 개체 반환해야 합니다면 2minTraceSize 변수입니다.
Bruno Medeiros

@BrunoMedeiros-참조하십시오 업데이트에 게시합니다.
barrypicker

일했다! 감사합니다! =)
Bruno Medeiros

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................