我使用以下文档架构:
//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项目的所有文档。
答案 0 :(得分:8)
当您对数组进行查询时,测试在概念上应用于数组的每个元素,直到它为其中一个元素返回true,或者直到到达数组的末尾。
所以查询:
db.items.find({ LedgerBook : { $type : 4 }})
实际上意味着:查找LedgerBook数组中至少有一个项本身就是数组的所有文档。尽管LedgerBook本身是一个数组,但它的元素都不是,所以没有文档匹配查询。
如果您只想查询具有LedgerBook元素的文档,可以使用:
db.items.find({ LedgerBook : { $exists : true }})
答案 1 :(得分:7)
数组的$ type是通过其第一个项的类型定义的。称之为错误或功能。向JIRA发布了一些问题......
答案 2 :(得分:2)
这听起来像个臭虫,我试过从mongovue运行{ "Array" : { $type : 4 } }
,但它对我来说也不起作用。去检查mongoshell ......
但是如果你想知道至少有一个项目的所有嵌套数组,你可以这样做:
db.users.find( { "LedgerBook.0.AccountId" : { $exists : true } })
更新:以下代码也没有在mongoshell中返回任何内容,所以我猜它的错误..
db.items.find( { "Array" : { $type : 4 } })