2011-04-08 16 views
6

utilizo documento siguiente esquema:

//User Document 
{ 
    "_id": "0610457c-b25b-4e73-b859-11987a3fe271", 
    "FirstName": "Some Name", 
    "LastName": "surname", 
    // it is array of ledger items 
    "LedgerBook": [ 
      { 
       "AccountId": "aadfgdf6319d3-1a12-4575-9776-c6653sdfg5c32527", 
       "TransactionId": "ef98bbc4-3efb-46dc-b632-5adfgdfg1fcc378446", 
       .... 
      }, 
      ... 
     ] 

y cuando intento de aplicar consulta db.users.find({ "LedgerBook" : { "$type" : 4 } }).limit(50); no devuelve nada, pero para consulta db.users.find({ "LedgerBook" : { "$type" : 3 } }).limit(50); funciona bien (todos los documentos que tiene Artículos de LedgerBook).

¿Por qué sucede?

type = 4 es Array y type = 3 is Object.

Quiero obtener todos los documentos que tengan al menos un elemento LedgerBook.

Respuesta

8

Cuando consulta en una matriz, la prueba se aplica conceptualmente a cada elemento de la matriz hasta que devuelve verdadero para uno de los elementos, o hasta que se alcanza el final de la matriz .

Así que la consulta:

db.items.find({ LedgerBook : { $type : 4 }}) 

en realidad significa: encontrar todos los documentos en los que al menos uno de los elementos de la matriz LedgerBook es en sí mismo una matriz. Aunque LedgerBook en sí es una matriz, ninguno de sus elementos es, por lo que ningún documento coincide con la consulta.

Si lo que desea es una consulta de documentos que tienen un elemento LedgerBook puede utilizar:

db.items.find({ LedgerBook : { $exists : true }}) 
+0

La primera consulta del comportamiento parece extraña para mí. ¿Cómo puedo verificar el tipo de LedgerBook dentro del documento principal? También @Andrei quiere que todos los documentos que contienen LedgerBook con elementos cuenten más de 1. Pero su segunda consulta devuelve todos los documentos que contienen LedgerBook (incluso si los elementos de la matriz cuentan igual a 0). –

+0

Así es como funcionan las consultas contra las matrices. Puede parecer extraño, pero la mayoría de las veces es exactamente lo que quieres. Para probar una matriz LedgerBook con 1 o más entradas, debe usar una cláusula $ where: –

+3

> db.items.find ({$ donde: función() {devuelva esta.instanciaLedgerBook de Array && this.LedgerBook.length > 0;}}) –

2

Parece un error, he intentado ejecutar { "Array" : { $type : 4 } } desde mongovue y tampoco funciona para mí. Que va a registrarse en mongoshell ...

Pero si quieres saber todo matriz anidada con al menos un elemento que puede hacerlo de esta manera:

db.users.find({ "LedgerBook.0.AccountId" : { $exists : true } }) 

Actualización: siguiente código también devuelven nada en mongoshell, así que supongo que es error ..

db.items.find({ "Array" : { $type : 4 } }) 
6

el tipo $ de una matriz se define a través del tipo de su primer artículo. Llámalo un error o una función. Existe un problema publicado en JIRA ...

+0

¿Puede por favor dar un enlace a un bug/función. Parece un error para mí ... De cualquier forma, gracias por señalarlo. +1 –

+0

https://jira.mongodb.org/browse/SERVER-1475 –

Cuestiones relacionadas