MongoDB

[Mongo] DBref $ 접근에러

끼발자 2021. 12. 15. 15:33
반응형
FieldPath field names may not start with '$'

사내 mongoDB 이전작업을 진행했다. 고 한다.

DB구조나 컬렉션명 모두 그대로 마이그레이션 했다고 하지만 어쩐일인지 위와 같은 에러가 나온다.

 

분명히 같은 쿼리인데.

 

lookup하는 과정에서 에러가 생겼다.

localField에 $를 사용하여 접근할 수 없다고.

 

DB구조는 대충 

{ 
    "_id" : ObjectId("blahlhablahl"), 
    "a" :  DBRef("a", ObjectId("thisisobjectid")),        
}
#a
{
	'_id': ObjectId('blahblahblah'),
	...
	'_class': 'class____', 
	'b': DBRef('b', ObjectId('objobjojb'))
}
#b
.....

 

대략 이런식이다.

 

한마디로 지금 보려하는 컬렉션에서 다른 컬렉션을 참조하고, 그 컬렉션에서 또 다른 컬렉션을 참조해야하는 구조이다.

 

원래라면 lookup으로

{
         '$lookup': {
             'from': "a",
             'localField': "a.$_id", # 이 부분
             'foreignField': "_id",
             'as' : "a"
         }
     }

이렇게 a 필드에서 .$로 접근이 가능했지만.

안된다. 위에서 언급한 에러로 필드에서 $를 통한 접근이 안된단다.

 

그래서 열심히 뒤져보았다. stack overflow

 

풀이는 다음과 같다.

{
    '$project': { 
        ...
        'pro': {'$arrayElemAt': [{'$objectToArray': "$a"}, 1]}, 
        
        }
}, 
{
    '$lookup': {
        'from':"a", 
        'localField':"pro.v",
        'foreignField':"_id", 
        'as':"solvedA"
    }
},

 

id에 직접 접근할 수 없으니 project를 통해 원하는 key / value를 뽑아내고, 참조할 때 id만 사용하도록 했다.

 

아직 몽고 하수라서 그런지 코드는 좀 지저분하다.

 

참조한 stackoverflow는 

https://stackoverflow.com/questions/40622714/mongo-how-to-lookup-with-dbref

반응형