반응형
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
반응형