запрос mongodb с оператором $ type не работает - PullRequest
7 голосов
/ 08 апреля 2011

Я использую следующую схему документа:

//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",
                ....
            },
            ... 
      ]

и когда я пытаюсь применить запрос db.users.find({ "LedgerBook" : { "$type" : 4 } }).limit(50);, он ничего не возвращает, но для запроса db.users.find({ "LedgerBook" : { "$type" : 3 } }).limit(50); работает хорошо (возвращает все документы, в которых есть элементы LedgerBook).

Почему это происходит?

type = 4 - Array, а type = 3 - Object.

Я хочу получить все документы, в которых есть хотя бы один элемент LedgerBook.

Ответы [ 3 ]

8 голосов
/ 08 апреля 2011

Когда вы выполняете запрос к массиву, тест концептуально применяется к каждому элементу массива до тех пор, пока он не вернет true для одного из элементов или пока не будет достигнут конец массива.

Итак, запрос:

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

на самом деле означает: найти все документы, где хотя бы один из элементов массива LedgerBook сам является массивом.Даже если сама LedgerBook является массивом, ни один из ее элементов не является таковым, поэтому ни один документ не соответствует запросу.

Если вы просто хотите запросить документы, содержащие элемент LedgerBook, вы можете использовать:

db.items.find({ LedgerBook : { $exists : true }})
7 голосов
/ 08 апреля 2011

Тип $ массива определяется через тип его первого элемента. Назовите это ошибкой или функцией. На JIRA опубликована какая-то проблема ...

2 голосов
/ 08 апреля 2011

Звучит как ошибка, я попытался запустить { "Array" : { $type : 4 } } из mongovue, и это также не работает для меня.Собираемся проверить в mongoshell ...

Но если вы хотите знать все вложенные массивы хотя бы с одним элементом, вы можете сделать это следующим образом:

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

Обновление: Следующий код также ничего не возвращает в mongoshell, поэтому я думаю, что это ошибка ..

db.items.find( { "Array" : { $type : 4 } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...