2011-06-17 15 views
28

Esta es mi documento:¿Cómo hago una consulta "NO ENCENDIDA" en Mongo?

{ 
    title:"Happy thanksgiving", 
    body: "come over for dinner", 
    blocked:[ 
     {user:333, name:'john'}, 
     {user:994, name:'jessica'}, 
     {user:11, name: 'matt'}, 
    ] 
} 

¿Cuál es la consulta para encontrar todos los documentos que no tienen usuario 11 en "bloqueado"?

+1

Olvidó una coma después de "venir a cenar": P – Zugwalt

Respuesta

43

Puede utilizar $ en o $ nin para "no en"

Ejemplo ...

> db.people.find({ crowd : { $nin: ["cool"] }}); 

pongo un montón más ejemplos aquí: http://learnmongo.com/posts/being-part-of-the-in-crowd/

+0

en lugar de "genial", ¿cómo puedo unir un elemento dentro de un diccionario? – TIMEX

+0

Pruebe algo como .... {"blocked.user": {$ nin: [11]}}? –

+2

Si tiene solo un elemento, también puede usar $ ne. Si está buscando un elemento dentro de una estructura anidada (en lugar de una matriz) puede verificar la existencia/inexistencia de la clave. Un ejemplo de esto sería db.myCollection.find ({'blockedPeople.george': {$ exists: false}}); – Zugwalt

2

Ver http://docs.mongodb.org/manual/reference/operator/query/nin/#op._S_nin

db.inventory.find({ qty: { $nin: [ 5, 15 ] } }) 

Esta consulta seleccionar todos los documentos de la colección de inventario donde el valor Cant campo no es igual a 5 ni 15. Los documentos seleccionados incluirán aquellos documentos que no lo hacen contiene el campo de cantidad.

Si el campo contiene una matriz, el operador $ nin selecciona los documentos cuyo campo contiene una matriz sin elemento igual a un valor en la matriz especificada (por ejemplo, etc.).

23

Dado que compara con un único valor, su ejemplo en realidad no necesita una operación NOT IN. Esto se debe a que Mongo aplicará sus criterios de búsqueda a cada elemento de un subdocumento de matriz. Se puede utilizar el NO ES IGUAL operador, $ ne, para conseguir lo que deseas, ya que toma el valor que no pueden aparecer en la búsqueda:

db.myCollection.find({'blocked.user': {$ne: 11}}); 

Sin embargo, si usted tiene muchas cosas que no puede ser igual, que es cuando usaría el operador NOT IN, que es $ nin. Se necesita un conjunto de valores que no pueden aparecer en la búsqueda:

db.myCollection.find({'blocked.user': {$nin: [11, 12, 13]}}); 
2

intente lo siguiente:

db.stack.find({"blocked.user":{$nin:[11]}}) 

Esto funcionó para mí.

Cuestiones relacionadas