2016-07-22 1 views
0

나는 몽고 빗과 레일을 처음 접했고 누군가 나를 도울 수 있기를 바랬다.이 원시 mongodb 자바 스크립트 쿼리를 레일 몽고로 번역하는 방법은 무엇입니까?

내가 Mongoid이 몽고의 .js 쿼리에 해당하는 실행하고 싶습니다 :

db.getCollection('users').find({interest_ids: { $in: [ObjectId("string")]}}).sort({rank: -1}).limit(100) 

지금까지 루비에서이 방법을 수행 한 :

users = User.in(interest_ids: ["string"]).order_by(:rank => 'desc').limit(100) 

이 작동을하지만, 매우 느립니다. 나중에

users.to_json 또는 그와 유사한 것으로 해결할 때까지 실제로 "체크인"하지 않습니다.

내가 몽고 셸에서 직접 쿼리를 실행하면 즉각적으로 원하는 결과를 얻을 수 있습니다.

도움이 될 것입니다.

답변

0

"string"ObjectId("string")은 MongoDB 셸에서 동일한 내용이 아닙니다. "string"BSON::ObjectId.from_string("string")은 몽고 이드를 사용할 때 동일한 것이 아닙니다. 그래서 자바 스크립트 하나에 해당하는 Mongoid 쿼리은 다음과 같습니다

User.in(interest_ids: [BSON::ObjectId.from_string("string")]) 
    .order_by(:rank => 'desc') 
    .limit(100) 

나 : 당신이 그들에게 강제로 그들과 함께 뭔가를 할 때까지

User.where(:interest_ids.in => [BSON::ObjectId.from_string("string")]) 
    .order_by(:rank => 'desc') 
    .limit(100) 

Mongoid 쿼리가 데이터베이스에 액세스하지 않는,이 액티브의 일치 행동을 기대해야합니다. 그런 다음 문서를로드하는 쿼리를 강제하려면 그렇게 말 :

User.where(:interest_ids.in => [BSON::ObjectId.from_string("string")]) 
    .order_by(:rank => 'desc') 
    .limit(100) 
    .to_a # <------------------- 

당신은 또한 .entries을 말하거나 등 .each

당신의 분야, interest_ids의 복수의 이름으로 결과를 반복 시작할 수 있었다, 실제로 BSON::ObjectId이 아닌 BSON::ObjectId의 배열임을 제안합니다.

db.getCollection('users').find({ interest_ids: ObjectId("string") }).sort({rank: -1}).limit(100) 

과 Mongoid 버전은 다음과 같습니다 : 그런 경우, 다음 MongoDB를 쿼리해야

User.where(:interest_ids => BSON::ObjectId.from_string("string")) 
    .order_by(:rank => 'desc') 
    .limit(100) 

MongoDB를 그렇게 { array_field: scalar_value } 모든 문서를 찾을 것 자체에 배열 필드 안에 볼 것이다 array_field의 요소 중 어느 하나가 scalar_value과 일치합니다.