2011-03-11 2 views
1

Je teste les données de printemps et le support de mongodb.Comportement de requête "OU" MongoDB inattendu

J'ai une question sur la création de la requête lors de l'utilisation de or-queries. Considérez ce qui suit:

Query query = new Query().or(new Query(where("receiverId").is(userId)), new Query(where("requesterId").is(userId))); 
query.and(where("status").is(status)); 

Cela se traduira par la requête mongodb suivante:

"$or" : [ { "receiverId" : { "$oid" : "4d78696025d0d46b42d9c579"}} , { "requesterId" : { "$oid" : "4d78696025d0d46b42d9c579"}}] , "status" : "REQUESTED"} 

Cela renvoie aucun résultat alors que l'on attend. L'exécution de cette requête dans les résultats de commande MongoDB en erreur suivant:

error: { "$err" : "invalid operator: $oid", "code" : 10068 } 

Modification de la requête et en cours d'exécution dans la commande mongodb fonctionne très bien:

{ "$or" : [ { "receiverId" : ObjectId("4d78696025d0d46b42d9c579")} , { "requesterId" : ObjectId("4d78696025d0d46b42d9c579")}] , "status" : "REQUESTED"} 

Notez l'utilisation de ObjectId (« ... ») au lieu de $ oid.

Est-ce que je vais quelque chose dans le mauvais sens? Peut-être que la configuration de la requête est incorrecte?

Répondre

2

Inspectez-vous cette variable de requête à l'exécution ou est-ce ce que vous voyez dans les journaux de MongoDB?

Dans le pilote C#, si vous inspectez la variable de requête, vous voyez également $ oid, mais ce n'est pas la requête réelle qui est envoyée au serveur. À un certain point, il change cela en une requête MongoDB valide.

Si vous utilisez Linux, vous pouvez démarrer mongosniff qui vous montrera les requêtes, les mises à jour et les insertions en temps réel au fur et à mesure. Si vous utilisez Windows, vous devez démarrer mongod.exe avec l'indicateur -vvvv qui lui permettra d'enregistrer chaque requête, mise à jour, insertion ou commande dans le fichier journal.

Ensuite, vous pouvez réellement voir la requête exacte qui est soumise.

+0

Merci! Utilisé mongosniff et ObjectId est réellement utilisé. – eirik