使用$type运算符的 MongoDB 查询不起作用



我使用以下文档模式:

//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项目的所有文档。

当您查询一个数组时,测试在概念上应用于数组的每个元素,直到它为其中一个元素返回true,或者直到到达数组的末尾。

所以查询:

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

的实际意思是:查找LedgerBook数组中至少有一项本身是数组的所有文档。尽管LedgerBook本身是一个数组,但它的元素都不是数组,因此没有文档匹配查询。

如果您只想查询具有LedgerBook元素的文档,您可以使用:

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

数组的$类型通过其第一项的类型来定义。你可以称它为bug或特性。有一些问题发布到JIRA…

这听起来像一个bug,我试过从mongovue运行{ "Array" : { $type : 4 } },它也不适合我。

但是如果你想知道所有嵌套数组至少包含一个元素,你可以这样做:

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

更新:下面的代码也返回没有在蒙古shell,所以我猜这是错误。

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

最新更新