IT

어레이의 첫 번째 요소를 가져오고 Aggregate를 사용하여 반환하시겠습니까?

itgroup 2023. 7. 17. 20:54
반응형

어레이의 첫 번째 요소를 가져오고 Aggregate를 사용하여 반환하시겠습니까?

Mongo 집계를 사용하여 배열의 첫 번째 요소를 가져오고 반환하려면 어떻게 해야 합니까?

다음 코드를 사용해 보았습니다.

db.my_collection.aggregate([
    { $project: {
        resp : { my_field: { $slice: 1 } }
    }}
])

하지만 다음과 같은 오류가 발생합니다.

uncaught exception: aggregate failed: {
    "errmsg" : "exception: invalid operator '$slice'",
    "code" : 15999,
    "ok" : 0
}

참고:'my_field'4개의 요소로 구성된 배열이며 첫 번째 요소만 반환하면 됩니다.

3.2 이후로는 배열의 첫 번째 요소를 가져오는 데 사용할 수 있습니다.

db.my_collection.aggregate([
    { $project: {
        resp : { $arrayElemAt: ['$my_field',0] }
    }}
])

현재,$slice연산자를 에서 사용할 수 없습니다.$project집계 파이프라인의 작업입니다.그래서 당신이 할 수 있는 일은

첫번째$unwind,그my_field배열, 그리고 나서 그것들을 그룹화하고 그것들을 가져갑니다.$first그룹의 요소입니다.

db.my_collection.aggregate([
{$unwind:"$my_field"},
{$group:{"_id":"$_id","resp":{$first:"$my_field"}}},
{$project:{"_id":0,"resp":1}}
])

또는 를 사용합니다.find()명령, 여기서 $185 연산자를 사용할 수 있습니다.projection일부.

db.my_collection.find({},{"my_field":{$slice:1}})

업데이트: 당신의 의견을 바탕으로, 당신은 오직 당신만 원한다고 말합니다.secondID가 있는 레코드의 경우 배열에 있는 항목id.

var field = 2;
var id = ObjectId("...");

그런 다음 아래 집계 명령은 다음의 두 번째 항목을 제공합니다.my_field레코드 배열과 함께_id,id.

db.my_collection.aggregate([
{$match:{"_id":id}},
{$unwind:"$my_field"},
{$skip:field-1},
{$limit:1}
])

위의 논리는 더 이상의 기록에 적용될 수 없습니다. 왜냐하면 그것은 다음을 포함하기 때문입니다.$group다음 연산자$unwind.그$group운영자는 특정 그룹의 모든 기록에 대해 단일 기록을 생성합니다.$limit또는$skip운영자들은 비효율적이기 위해 후기 단계에서 적용되었습니다.

의 작은 변형.find()위의 쿼리를 사용하면 예상 결과도 얻을 수 있습니다.

db.my_collection.find({},{"my_field":{$slice:[field-1,1]}})

레코드 수가 매우 많은 경우 약간의 비용이 들지만 이러한 작업은 클라이언트 측에서 수행할 수 있습니다.

var field = 2; 
db.my_collection.find().map(function(doc){
return doc.my_field[field-1];
})

위의 옵션 중에서 선택하는 것은 데이터 크기와 앱 설계에 따라 달라집니다.

시작하는Mongo 4.4집계 연산자를 사용하여 배열의 첫 번째 요소에 액세스할 수 있습니다.

// { "my_field": ["A", "B", "C"] }
// { "my_field": ["D"] }
db.my_collection.aggregate([
  { $project: { resp: { $first: "$my_field" } } }
])
// { "resp" : "A" }
// { "resp" : "D" }

다음 티켓에 따르면 $209 운영자는 Mongo 3.1.4의 $project 운영에서 사용할 수 있도록 예정되어 있습니다. https://jira.mongodb.org/browse/SERVER-6074

이렇게 하면 문제가 해결됩니다.

이 버전은 현재 개발자 릴리스에 불과하며 2015년 7월 기준으로 아직 안정적이지 않습니다.이것은 10월/11월쯤 예상됩니다.

Mongo 3.1.6 이후 버전,

db.my_collection.aggregate([
{ 
    "$project": {
        "newArray" : { "$slice" : [ "$oldarray" , 0, 1 ] }
    }
}
])

어디에0시작 인덱스입니다.1슬라이스할 요소의 개수입니다.

언급URL : https://stackoverflow.com/questions/26762887/get-first-element-in-array-and-return-using-aggregate

반응형