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

And*_*ich 7 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",
                ....
            },
            ... 
      ]
Run Code Online (Sandbox Code Playgroud)

当我尝试应用查询时,db.users.find({ "LedgerBook" : { "$type" : 4 } }).limit(50);它什么都不返回,但是查询db.users.find({ "LedgerBook" : { "$type" : 3 } }).limit(50);效果很好(返回所有包含LedgerBook项目的文档).

为什么会这样?

type = 4是Array,type = 3是Object.

我想获得至少有一个LedgerBook项目的所有文档.

Rob*_*tam 8

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

所以查询:

db.items.find({ LedgerBook : { $type : 4 }})
Run Code Online (Sandbox Code Playgroud)

实际上意味着:查找LedgerBook数组中至少有一个项本身就是数组的所有文档.尽管LedgerBook本身是一个数组,但它的元素都不是,所以没有文档匹配查询.

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

db.items.find({ LedgerBook : { $exists : true }})
Run Code Online (Sandbox Code Playgroud)

  • > db.items.find({ $where : function() { return this.LedgerBook instanceof Array && this.LedgerBook.length > 0; }}) (3认同)

小智 7

数组的$类型是通过其第一个项的类型定义的.称之为错误或功能.向JIRA发布了一些问题......