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?
risposta
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
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? –
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
Grazie per la risposta Andrew, ma ho trovato la causa e ho risolto lo stesso. –
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.
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
Dovresti essere in grado di ottenerlo da Mongoid: 'Mongoid :: Sessions.default' restituirà un' Ciclomotore :: Sessione' da cui puoi fare tutte le cose del Ciclomotore. –
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
Come qualcuno ha menzionato qui, la vostra risposta è ciclomotore. Ecco il mio esempio per uno script ruby (semplice test.rb di file)
- 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}"
Per Mongoid 5:
db = Mongoid::Clients.default
collection = db[:collection_name]
Ora possiamo eseguire query sulla raccolta
Questo comando con mongoid 5.1 – Brandt
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
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
Sì, sto usando mongoid 3 – Andrew