2014-11-26 2 views
3

으로 밀어 MongoDB를 나는 내가 다음 쿼리는 위치 상 운영자가 작동하지

db.users.find({ 
    "_id":{"$ne":"385516561596016"}, 
    "playDates":{"$in":["2014-11-26"]}, 
    "matches":{"$elemMatch":{ 
     "userId":"385516561596016", 
     "dates":{"$nin":["2014-11-26"]}}}}) 

그것은 위의 문서를 반환에게 '사용자의 수집

{ 
    "_id" : "388179687996974", 
    "matches" : [ 
     { 
      "userId" : "1495728740672094", 
      "choice" : false, 
      "dates" : [], 
      "dateId" : null 
     }, 
     { 
      "userId" : "385516561596016", 
      "choice" : true, 
      "dates" : [], 
      "dateId" : "2014-11-26_385516561596016_388179687996974" 
     }, 
     { 
      "userId" : "253752728167114", 
      "choice" : false, 
      "dates" : [], 
      "dateId" : null 
     }, 
     { 
      "userId" : "365296866955687", 
      "choice" : null, 
      "dates" : [ 
       "2014-11-26" 
      ], 
      "dateId" : null 
     } 
    ], 
    "playDates" : [ 
     "2014-11-26" 
    ]  
} 

에서 다음과 같은 문서가있다.

나는 다음과 같이 위치 연산자를 사용하여 문서를 업데이트하기 위해 노력하고있어 :

db.users.update({ 
    "_id":{"$ne":"385516561596016"}, 
    "playDates":{"$in":["2014-11-26"]}, 
    "matches":{"$elemMatch":{"userId":"385516561596016", 
      "dates":{"$nin":["2014-11-26"]}}}}, 
    {"$push":{"matches.$.dates":"2014-11-26"}}) 

을 대신 userId를 385,516,561,596,016을 위해 경기에 2014년 11월 26일을 가하고, 그것은이 경기에 넣는다 [0].

내가 뭘 잘못하고 있니?

답변

2

이것은 mongodb 버그와 같은 냄새를 풍깁니다. 나는 여러 가지 변형을 시도했다.

db.items.update({ 
"_id":{"$ne":"385516561596016"},  
    //without the playDates $in clause 
"matches":{"$elemMatch":{"userId":"253752728167114"} } } , 
{"$push":{"matches.$.dates":"test"} }) 

예상대로 작동하여 "테스트"를 3 번째 항목에 넣습니다.

이 너무 최대 $ 설정 놨 같이 $ 푸시 연산자 버그가 아닙니다 :

db.items.update({ 
"_id":{"$ne":"385516561596016"},  
"playDates":{"$in":["2014-11-26"]}, 
"matches":{"$elemMatch":{"userId":"253752728167114"} } } , 
{"$set":{"matches.$.other":"bob"} }) 
//fails 


db.items.update({ 
"_id":{"$ne":"385516561596016"},  
"matches":{"$elemMatch":{"userId":"253752728167114"} } } , 
{"$set":{"matches.$.other":"joe"} }) 
//success 

나는 당신이 JIRA에보고해야한다 생각합니다. https://jira.mongodb.org/secure/Dashboard.jspa (운이 좋으면 1 년 후에 문제를 해결할 수 있습니다.) 지금까지는 1/8 문제를 해결했습니다.)

그 사이에 아마도 applogic을 변경할 수 있습니다. playDates는 필요하지 않습니까?

+0

이미 존재합니다. https://jira.mongodb.org/browse/SERVER-14837 – Sammaye

+0

장난감 데이터베이스 작업의 즐거움. 생각할 수있는 잠재적 인 해결 방법이 있습니까? – Jeff

1

playDatesmatches 한 개의 쿼리에서 두 개의 배열을 쿼리하는 것이 문제입니다. 쿼리에 {"$in":["2014-11-26"]}playDates[0]를 일치하기 때문에

는 MongoDB를가 matches[0]에 데이터를 넣습니다, 그래서 MongoDB를 0

불행하게도, 내가 어떻게 "playDates":{"$in":["2014-11-26"]} 일부를 제거하지 않고 문제를 해결하는 방법 아무 생각이 색인에 $을 결합한다.

+0

좋은 점, 아마도 내가 생각했던 버그가 아닙니다. –

+0

가능한 모든 해결 방법은 무엇입니까? – Jeff

1

하나의 쿼리 문서에서 matchesplayDates과 같은 두 개의 다른 배열의 값을 일치 시키려고합니다. 이것은 현재 MongoDB에서 지원되지 않습니다. dos으로 당

:

쿼리 문서에만 배열 필드에 하나의 조건을 포함해야 투사된다. 여러 조건이 내부적으로 서로 을 무시하고 정의되지 않은 동작으로 이어질 수 있습니다.이러한 요구 사항에서

, 다음 쿼리는 올바르지 않습니다 $의 사용이 배열 중 하나에 일치하는 하위 문서를 업데이트 할 수 있기 때문에

db.collection.find({ <array>: <value>, <someOtherArray>: <value2> }, 
        { "<array>.$": 1 }) 

, undefined 행동의 결과는 해결하는 것 두 개의 쿼리를 실행합니다. 하나는 문서를 찾고, 다른 하나는 값이 응용 프로그램 코드에서 수정 된 후 업데이트합니다.