2016-07-22 12 views
0

Ich bin neu in Mongodb und Schienen, und ich hatte gehofft, jemand könnte mir helfen.Wie übersetzt man diese rohe mongodb Javascript-Abfrage in Rails Mongoid?

Ich möchte das Äquivalent dieser Mongo Js Abfrage in Mongoid auszuführen:

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

Ich habe bisher in rubin es so gemacht:

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

Dies funktioniert, aber es ist sehr langsam. Es führt den "in" Check nicht wirklich durch, bis ich es später mit

users.to_json oder etwas ähnlichem auflöse.

Wenn ich die Abfrage direkt in einer Mongo-Shell ausführen, ist es sofort und hat was ich will.

Jede Hilfe würde sehr geschätzt werden!

Antwort

0

"string" und ObjectId("string") sind nicht dasselbe in der MongoDB-Shell. "string" und BSON::ObjectId.from_string("string") sind nicht dasselbe bei der Verwendung von Mongoid. So entspricht Mongoid Abfrage zu Ihrem JavaScript sein würde:

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

oder:

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

Mongoid Abfragen nicht auf die Datenbank zugreifen, bis Sie etwas mit ihnen zu tun, die sie zwingt, stimmt dieses Active des Verhalten so sollte es erwartet werden. Wenn Sie die Abfrage erzwingen wollen sagen, die Dokumente zu laden, dann so:

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

Sie auch .entries sagen könnte oder von vorne beginnen die Ergebnisse iterieren mit .each usw.

Der Plural Name des Feldes, interest_ids, schlägt vor, dass es tatsächlich eine Anordnung von BSON::ObjectId anstatt einer einzigen BSON::ObjectId ist. Wenn das der Fall ist, dann sollten Sie Ihre MongoDB Abfrage sein:

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

und die Mongoid Version wäre:

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

MongoDB wird innerhalb eines Array-Feldes auf eigene sehen so { array_field: scalar_value } werden alle Dokumente finden wobei eines der Elemente in array_field mit scalar_value übereinstimmt.

Verwandte Themen