2013-02-11 12 views
25

Sto scrivendo una migrazione per un'applicazione Rails che usa MongoDB e Mongoide. La mia migrazione attualmente utilizza i miei modelli che usano Mongoid per interrogare e aggiornare i record, ma le prestazioni sono sub-par. Sto essenzialmente aggiornando tutti i record di una grande collezione e facendo n + 20 query. Ho ucciso la migrazione dopo aver impiegato un'ora per eseguire localmente (e non ho terminato). Mi piacerebbe essere in grado di eseguire query non elaborate su mongo senza troppi sforzi. Presumo che ci sia un modo per accedere a un driver mongo da Mongoid poiché Mongoid ha già caricato una connessione al database. Come posso accedere al database per eseguire le mie domande di aggiornamento direttamente?Come interrogare MongoDB direttamente da Ruby invece di usare Mongoid?

+0

in esecuzione su mongoid 3 o 2 se 2 si adapater diverso rispetto ciclomotore non ricordo il nome, ma credo che 'mongodb-ruby-driver' – Viren

+0

Sì, sto usando mongoid 3 – Andrew

risposta

32

Se si utilizza Mongoid 3, fornisce un facile accesso al suo driver MongoDB: Moped. Ecco un esempio di accesso alcuni dati grezzi senza l'utilizzo di modelle per accedere ai dati:

db = Mongoid::Sessions.default 

# inserting a new document 
collection = db[:collection_name] 
collection.insert(name: 'my new document') 

# finding a document 
doc = collection.find(name: 'my new document').first 

# iterating over all documents in a collection 
collection.find.each do |document| 
    puts document.inspect 
end 
+0

Ciao Andrew, la tua risposta è utile, ma sto usando mongoid e l'accesso diretto alle raccolte come menzionato nella tua risposta, funziona bene, ma alcune come dopo aver usato queste operazioni mongoidiche di attiverecord come Model.save, Model.update_attributes, ecc. non funzionano, puoi suggerire qualche soluzione per questo? –

+0

Difficile sapere cosa sta succedendo senza vedere alcuni esempi di codice. Penso che dovresti postare questa come tua domanda e includere un esempio di codice. – Andrew

+0

Grazie per la risposta Andrew, ma ho trovato la causa e ho risolto lo stesso. –

1

La risposta breve è Moped. Questa è l'API di livello inferiore su cui è costruito Mongoid e che sarà disponibile se usi già Mongoid. L'API del ciclomotore è un sottile involucro attorno alle operazioni di MongoDB non elaborate. La documentazione qui: http://mongoid.org/en/moped/docs/driver.html dovrebbe essere utile.

+0

Questo è quello che ho pensato , ma come posso accedervi? Nei documenti gli esempi mostrano 'Moped :: Session.new (host) .use (database)' ma questa informazione è già definita in un file di configurazione caricato automaticamente da Mongoid. Dovrei essere in grado di accedere a una specie di oggetto del ciclomotore da Mongoid. Io proprio non so come. – Andrew

+3

Dovresti essere in grado di ottenerlo da Mongoid: 'Mongoid :: Sessions.default' restituirà un' Ciclomotore :: Sessione' da cui puoi fare tutte le cose del Ciclomotore. –

6

Ecco come farlo (questo dovrebbe funzionare per 2+ e 3+ così)

1) Tutti vostra esposizione Modello questo comportamento si ha includono Mongoid :: Documento dentro tutto il vostro modello in modo tecnicamente ogni documento viene mappato in monogodb attraverso motorino o mongodb-ruby conducente tramite mongoid

quindi se avete modello come

class PerformerSource 
    include Mongoid::Document 
    ## Definition 

end 

ora che è possibile eseguire Mongo query utilizzando il driver (ciclomotore o MongoDB-ruby autista) come questo

PerformerSource.collection.insert("something") 
## where something is json document you want to insert 

Questo darebbe u il ciclomotore (se si utilizza mongoid 3) Collegamento per il documento

2) Si può anche fare qualcosa di simile

Mongoid::Sessions.default.collections.find { |document| document.name == "performer_sources"}.insert("something") 

Come più su Mongo query e come mongoid mappa quelli che utilizzano ciclomotore u può seguire la sezione this di query in cui descrive come query viene acheived internamente tramite ciclomotore

Spero che questo aiuto

+0

che aiuta, grazie! – Andrew

+0

Quello che viene contrassegnato come risposta funziona solo in 'rails console', ma questo, funziona all'interno del' Modello'. Sto usando Mongoid 4.0.2. – Charlie

1

Come qualcuno ha menzionato qui, la vostra risposta è ciclomotore. Ecco il mio esempio per uno script ruby ​​(semplice test.rb di file)

  1. Definire un mongoid.yml (in questo caso, a localhost)

development: sessions: default: database: test_development hosts: - localhost:27017 options: 2.Set config di carico e la raccolta di prova

#!/usr/bin/env ruby 
require 'mongoid' 

Mongoid.load!("path/to/file/mongoid.yml",:development) # :development corresponds to mongoid.yml first line environment 
db = Mongoid::Sessions.default 
puts "Collection documents count :> #{db[:collection].find.count}" 
5

Per Mongoid 5:

db = Mongoid::Clients.default 

collection = db[:collection_name] 

Ora possiamo eseguire query sulla raccolta

+0

Questo comando con mongoid 5.1 – Brandt

0

Se si utilizza mongoid 5 (cinque) Ti consiglio di utilizzare questo.

Item.collection.update_one({_id: BSON::ObjectId('55512b7070722d22d3050000')}, '$set' => { 'category_name': 'Test' }) 

Il trucco per questo è BSON :: ObjectID. Questo è come nella query mongo se vuoi cercare un singolo id.

db.items.update({ '_id': ObjectId("55512b7070722d22d3050000") }, { $set: {'category_name': 'Test' } }) 

Sopra è la versione mongo della query. Ho trovato la traduzione di codice rubino in codice mongo è la parte difficile in quanto vi sono alcuni pezzi che possono essere un po 'difficili da trovare nella documentazione.

http://www.rubydoc.info/gems/mongo/Mongo%2FCollection%3Aupdate_one

Problemi correlati