2011-04-08 58 views
6

我用下面的文檔模式:

//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項目的所有文檔。

回答

8

當您查詢對一個陣列的測試概念應用到陣列中的每個元素,直到它的元素之一返回true,或直至達到數組末尾。

所以查詢:

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

,其實就是:找到的所有文件,其中LedgerBook陣列的項目中的至少一個是自身的數組。儘管LedgerBook本身是一個數組,但它的元素都不是,所以沒有文檔與查詢匹配。

如果你只是想查詢有可以使用LedgerBook元素文件:

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

第一個查詢行爲對我來說看起來很奇怪。如何檢查母文件中的LedgerBook類型?此外,@Andrei還希望包含LedgerBook的所有文檔的項數都大於1.但您的第二個查詢將返回包含LedgerBook的所有文檔(即使數組項計數等於0)。 – 2011-04-08 14:17:23

+0

這就是針對數組的查詢的工作方式。可能看起來很奇怪,但大多數時候這正是你想要的。要測試LedgerBook陣列與1個或多個條目你必須使用$ where子句: – 2011-04-08 15:19:09

+3

> db.items.find({$其中:函數(){返回this.LedgerBook的instanceof陣列&& this.LedgerBook.length > 0;}}) – 2011-04-08 15:20:44

2

聽起來像是一個bug,我試過從mongovue運行{ "Array" : { $type : 4 } },它也不適用於我。要在mongoshell檢查...

但是,如果你想知道的所有嵌套陣列與至少一個項目,你可以做這樣的:

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

更新:下面的代碼還沒有返回mongoshell,所以我猜這是bug ..

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

數組的$類型是通過它的第一個項目的類型來定義的。稱它爲錯誤或功能。有一些問題發佈到JIRA ...

+0

能否請您給鏈接到一個bug /功能。這對我來說就像一個bug ...以任何方式感謝您指出它。 +1 – 2011-04-08 13:51:49

+0

https://jira.mongodb.org/browse/SERVER-1475 – 2011-04-08 14:03:55