bestsource

예외: BSON 유형 EOO에서 날짜로 변환할 수 없습니다.

bestsource 2023. 7. 3. 23:02
반응형

예외: BSON 유형 EOO에서 날짜로 변환할 수 없습니다.

다음 집계 쿼리를 실행하는 데 문제가 있습니다.

db.snippets.aggregate([ { '$project': { month: { '$month': '$created_at' }} } ])

동일한 오류 메시지는 다음과 같습니다.

assert: command failed: {
        "errmsg" : "exception: can't convert from BSON type EOO to Date",
        "code" : 16006,
        "ok" : 0 } : aggregate failed

이 문제를 어떻게 해결해야 합니까?관련 질문을 발견했습니다.MongoDB: BSON 유형 EOO에서 Date로 변환할 없습니다.

하지만 어떻게 해야 하는지는 알려주지 않습니다.

하나 이상의 문서가 있을 수 있습니다.created_atBSON이 아닌 가치Date그리고 당신은 그 값들을 로 변환함으로써 그것을 고칠 필요가 있을 것입니다.Date제거할 수도 있습니다.

당신은 그 문서들을 찾을 수 있습니다.$not다음과 같은 연산자를 사용하는 쿼리:

db.snippets.find({created_at: {$not: {$type: 9}}})

만약에created_at값은 날짜 문자열입니다. 업데이트가 필요한 문서를 찾은 다음 다음 다음과 같은 코드를 사용하여 셸에서 업데이트할 수 있습니다.

db.snippets.find({created_at: {$not: {$type: 9}}}).forEach(function(doc) {
    // Convert created_at to a Date 
    doc.created_at = new Date(doc.created_at);
    db.snippets.save(doc);
})

이것을 시도해 보세요, 그것은 위의 문제에서 저에게 도움이 됩니다.

db.snippets.aggregate([{
'$project': {
    month: { $substr: ["$created_at", 5, 2] }
}
 }]);

위의 코드는 월 단위로 됩니다.

데이터는 쉽게 작업할 수 있는 ISO 형식으로 데이터베이스에 입력됩니다.

경우에 따라 일부 문서에는 날짜 필드가 비어 있어야 합니다.이러한 경우 다음을 시도할 수 있습니다(예를 사용).

db.snippets.aggregate([ { '$project': { month:  
 { $cond: [{ $ifNull: ['$created_at', 0] }, { $month: '$created_at' }, -1] }} } ])

이 예제에서는 '$created_at' 필드가 발견되지 않을 때마다 -1을 얻습니다.다른 모든 경우에는 날짜 월을 받을 수 있습니다.

관련 문제가 있었지만, 제 경우 날짜 필드가 배열의 멤버였기 때문에 "BSON 유형 개체를 날짜로 변환할 수 없습니다."라는 오류가 발생했습니다.

가능한 TripDateTimes 배열의 날짜에서 요일을 가져와야 했습니다.

샘플 문서:

{
"possibleTripDateTimes" : [
    {
        "tripDateTime" : ISODate("2015-08-01T06:00:00.000-0700")
    }
]
}

수정은 단순히 도트 표기법을 사용하여 배열 멤버 필드를 지정하는 것이었습니다.

db.trips.aggregate([
  {
       $project: {
         departTime: {
           $map: {
             input: "$possibleTripDateTimes.tripDateTime",
             as: "dateTime",
             in: { $dayOfWeek: "$$dateTime" }
           }
   }
  }
}
]
);

나는 이것이 또한 "BSON 유형 객체" 검색에서 검색 결과를 0으로 얻는 사람에게 도움이 되기를 바랍니다.

동일한 문제가 발생했습니다. 일부 문서의 날짜 필드가 누락되어 변환이 실패했습니다.저는 이것들을 걸러내기 위해 match 절을 추가했습니다.하지만 물론 저는 앱 쪽에서 왜 그들이 채워지지 않는지 조사하고 있습니다.

db.snippets.aggregate([
  {
    '$match': {
      'created_at': {
        "$exists": true
      }
    }
  },
  {
    '$project': {
      month: {
        '$month': '$created_at'
      }
    }
  }
])

저도 비슷한 문제가 있어서 날짜가 있는지 확인하고 해결했습니다.

db.users.aggregate([
{$project:{day:  { $cond: ["$bd", { $dayOfMonth: "$bd" }, -1] },
           month:  { $cond: ["$bd", { $month: "$bd" }, -1] },
           year:  { $cond: ["$bd", { $year: "$bd" }, -1] }
           }},
{$match:{"month":1, "day":15}}
])

내 날짜 필드는bd그리고 그 경기로 1월 15일에 생일을 맞는 모든 사용자를 얻을 수 있습니다.

데이터베이스에 있는 속성과 관련하여 속성의 이름을 잘못 지정한 경우에도 이 오류가 발생할 수 있습니다.

예를 들어, 내 코드는

$group: {
        _id: {$week: "$projects.timeStamp"},
        total: { $sum: "$projects.hours"  }
    }

하지만 저는 제 데이터베이스에 타임스탬프를 기록하지 않았기 때문에 간단하게 수정할 수 있습니다.projects.timestamp고쳤습니다.

먼저, 데이터 유형이 ISODATE에 있는지 확인해야 하며, 그렇지 않을 경우 다음과 같이 변경할 수 있습니다.

db.collectionName.find().forEach(function(each_object_from_collection){each_object_from_collection.your_date_field=new ISODate(each_object_from_collection.your_date_field);db.collectionName.save(each_object_from_collection);})

이제 두 가지 방법으로 찾을 수 있습니다.

db.collectionName.find({ $expr: {$eq: [{ $year: "$your_date_field" }, 2017]}});

또는 집계별로

db.collectionName.aggregate([{$project: {field1_you_need_in_result: 1,field12_you_need_in_result: 1,your_year_variable: {$year: '$your_date_field'}, your_month_variable: {$month: '$your_date_field'}}},{$match: {your_year_variable:2017, your_month_variable: 3}}])

먼저 다음과 같이 문제를 일으키는 특정 필드를 식별할 수 있습니다.


    db.collectionName.find( { 'dateField' : { $type : 2 } } )

위의 줄은 필드 이름이 'dateField'이고 유형이 String($type - 2)인 모든 문서를 확인하고 찾습니다.

확인 및 확인이 완료되면 다음과 같이 레코드를 수정할 수 있습니다.


    db.collectionName.find( { 'dateField' : { $type : 2 } } ).forEach( function (x) {   
      x.dateField = new ISODate(x.dateField);
      db.collectionName.save(x);
    });

제 경우 "$toDate"를 사용해야 했고 작동했습니다.

db.snippets.aggregate([ { '$project': { month: { '$month': {$toDate: '$created_at'} }} } ])

언급URL : https://stackoverflow.com/questions/28415995/exception-cant-convert-from-bson-type-eoo-to-date

반응형