2017-09-30 1 views
2

Dans la documentation MongoDB est dit que

db.inventory.find({ 
    $and : [ 
     { $or : [ { price : 0.99 }, { price : 1.99 } ] }, 
     { $or : [ { sale : true }, { qty : { $lt : 20 } } ] } 
    ] 
}) 

Cette requête ne peut être construit en utilisant une implicite et d'exploitation, car il utilise plus d'une fois $ ou opérateur.

https://docs.mongodb.com/manual/reference/operator/query/and/

Que devez-vous attendre si vous utilisez implicite et pour deux ou de? Le comportement est-il bien défini?

De cette expérience, on dirait qu'il ne tient pas compte du premier OU prédicat ..

> db.mytest.insertMany([ 
{w: 0, x: 0, y: 0, z: 0 }, 
{w: 0, x: 0, y: 1, z: 0 }, 
{w: 0, x: 0, y: 1, z: 1 }, 
{w: 0, x: 1, y: 0, z: 0 }, 
{w: 0, x: 1, y: 0, z: 1 }, 
{w: 0, x: 1, y: 1, z: 0 }, 
{w: 0, x: 1, y: 1, z: 1 }, 
{w: 1, x: 0, y: 0, z: 0 }, 
{w: 1, x: 0, y: 1, z: 0 }, 
{w: 1, x: 0, y: 1, z: 1 }, 
{w: 1, x: 1, y: 0, z: 0 }, 
{w: 1, x: 1, y: 0, z: 1 }, 
{w: 1, x: 1, y: 1, z: 0 }, 
{w: 1, x: 1, y: 1, z: 1 }, 
]) 
... 
>db.mytest.find({$or: [ {w: 1}, { x: 1} ],$or: [ {y: 1}, { z: 1} ]}) 
{ "_id" : ObjectId("59ce696828f7ac6a3372e64d"), "w" : 0, "x" : 0, "y" : 1, "z" : 0 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e64e"), "w" : 0, "x" : 0, "y" : 1, "z" : 1 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e650"), "w" : 0, "x" : 1, "y" : 0, "z" : 1 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e651"), "w" : 0, "x" : 1, "y" : 1, "z" : 0 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e652"), "w" : 0, "x" : 1, "y" : 1, "z" : 1 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e654"), "w" : 1, "x" : 0, "y" : 1, "z" : 0 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e655"), "w" : 1, "x" : 0, "y" : 1, "z" : 1 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e657"), "w" : 1, "x" : 1, "y" : 0, "z" : 1 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e658"), "w" : 1, "x" : 1, "y" : 1, "z" : 0 } 
{ "_id" : ObjectId("59ce696828f7ac6a3372e659"), "w" : 1, "x" : 1, "y" : 1, "z" : 1 } 
> 

Je pose la question parce que le comportement me semble incompatible. J'ai utilisé un AND implicite avec des OR dans quelques endroits de mon code. L'un d'eux a semblé donner la même réponse que vous attendez d'utiliser et explicite ET. C'était une requête complexe, donc j'ai peut-être fait une erreur dans la requête ou dans le test. Ce serait bien de savoir ce qui se passe ici ... il y a peut-être un autre bug que je dois encore éliminer.

+1

C'est un plan JavaScript non lié à Mongodb. Un objet ne peut pas avoir de propriétés du même nom – Shubham

Répondre

3

MongoDB traite

{$or: [ {w: 1}, { x: 1} ],$or: [ {y: 1}, { z: 1} ]} 

comme

{$or: [ {y: 1}, { z: 1} ]} 

Lorsque 2 clés sont les mêmes dans une MongoDB requête, le dernier remplace le précédent. Comme expliqué dans le docs, vous aurez besoin d'un $and explicite ici.