감사에 대한 샘플 데이터를 확보합니다. 내 대답이 될 것이 원 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" }
}
}
])