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
- 1. Come accedere direttamente all'API MongoDB da Mongoid?
- 2. Come interrogare MongoDB da R?
- 3. d3.sparql - Come interrogare gli endpoint SPARQL direttamente da D3js?
- 4. Inserire JSON in MongoDb direttamente da PHP
- 5. Come ottenere l'elenco dei database mongodb e l'elenco delle raccolte da un'app ruby on rails
- 6. Come usare Querystring invece di ';'
- 7. come interrogare oggetti figlio in mongodb
- 8. Interrogare un array di array in MongoDB
- 9. Come sapere se esiste una raccolta in MongoDB usando Mongoid?
- 10. Interrogare un campo di matrice che contiene gli hash in mongoid
- 11. Mongoid ha Map/Reduce?
- 12. Come posso usare `str.format` direttamente come` __repr__`?
- 13. Errore MongoDB con Mongoid, Heroku, Device, MongoHQ e Rails
- 14. Come posso vedere le query mongoDB non elaborate con Mongoid
- 15. Interrogare i documenti nidificati usando Mongoose (MongoDB)
- 16. Usare cassandra invece di memcache?
- 17. Come usare div invece di tabelle
- 18. find_one MongoDB Ruby Driver
- 19. Migrazione a MongoDB: come interrogare GROUP BY + WHERE
- 20. L'utilizzo delle migrazioni con Rails/Mongoid/MongoDB ha senso?
- 21. Cosa usare invece di org.jboss.resteasy.client.ClientRequest?
- 22. ObjectID Mongo: sicuro da usare in natura?
- 23. Come salvare correttamente un fuso orario con Ruby e MongoId?
- 24. Query aggregata condizionale MongoDB su una relazione HABTM (Mongoid, RoR)?
- 25. Posso usare SafeHandle invece di IntPtr?
- 26. Come interrogare in base al tempo in MongoDB con PHP?
- 27. Come posso usare le espressioni regolari con Docodine Mongodb ODM?
- 28. Richiedi una posizione di download invece di scaricare direttamente
- 29. Cosa usare invece di associazioni polimorfiche?
- 30. Come interrogare oggetti nidificati?
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