web-dev-qa-db-fra.com

Comment interroger MongoDB directement à partir de Ruby au lieu d'utiliser Mongoid?

J'écris une migration pour une application Rails qui utilise MongoDB et Mongoid. Ma migration utilise actuellement mes modèles qui utilisent Mongoid pour interroger et mettre à jour des enregistrements, mais les performances sont médiocres. Je suis essentiellement en train de mettre à jour tous les enregistrements d'une grande collection et de faire n + 20 requêtes. J'ai tué la migration après avoir pris une heure à courir localement (et je n'ai pas fini). Je voudrais pouvoir exécuter des requêtes brutes à Mongo sans trop d'effort. Je suppose qu'il existe un moyen d'accéder à un pilote Mongo depuis Mongoid, étant donné que Mongoid a déjà chargé une connexion à la base de données. Comment puis-je accéder à la base de données pour exécuter mes requêtes de mise à jour directement?

25
Andrew

Si vous utilisez Mongoid 3, il offre un accès facile à son pilote MongoDB: Moped . Voici un exemple d'accès à des données brutes sans utiliser de modèles pour accéder aux données:

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
32
Andrew

Pour Mongoid 5:

db = Mongoid::Clients.default

collection = db[:collection_name]

Maintenant, nous pouvons effectuer des requêtes sur la collection

7
Venu

Voici comment vous le faites (cela fonctionnerait pour 2+ et 3+ aussi) 

1) Tous vos modèles présentent ce comportement que vous avez incluent Mongoid :: Document dans votre modèle. Ainsi, techniquement, chaque document est mappé dans un pilote monogodb à cyclomoteur ou mongodb-Ruby via un périphérique mongoïde.

alors si vous avez le modèle Like

class PerformerSource 
  include Mongoid::Document
  ## Definition

end

Maintenant vous pouvez exécuter Mongo Query en utilisant le pilote (pilote Moped ou Mongodb-Ruby) comme ceci

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

Cela vous donnerait la connexion avec le cyclomoteur (si vous utilisez la machine principale 3) pour ce document

2) Vous pouvez aussi faire quelque chose comme ça 

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

Comment en savoir plus sur la requête mongo et comment mongoid mapper ceux qui utilisent un cyclomoteur u peuvent suivre this section de requête où il décrit comment la requête est réalisée en interne via un cyclomoteur 

J'espère que cette aide

6
Viren

La réponse courte est Cyclomoteur . Ceci est l’API de bas niveau sur laquelle Mongoid est construit et sera disponible si vous utilisez déjà Mongoid. L'API de cyclomoteur est une enveloppe mince autour des opérations MongoDB brutes. La documentation ici: http://mongoid.org/en/moped/docs/driver.html devrait être utile.

1
Ben Ashford

Comme tout le monde le mentionne ici, votre réponse est Moped. Voici mon exemple de script Ruby (fichier simple test.rb)

  1. Définir un mongoid.yml (dans ce cas, à localhost)

development: sessions: default: database: test_development hosts: - localhost:27017 options: 2. Définir la configuration de la charge et la collection de tests

#!/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}"
1
Machinerium

Si vous utilisez mongoid 5(five), je vous recommanderais de l'utiliser. 

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

Le truc à cela est le BSON :: ObjectID. C'est comme dans la requête Mongo si vous voulez rechercher un seul identifiant. 

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

Ci-dessus, la version Mongo de la requête. J'ai trouvé que traduire le code Ruby en code mongo était la partie la plus difficile, car il existe quelques éléments qui peuvent être un peu difficiles à trouver dans la documentation. 

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

0
Brandt