2014-07-25 46 views
23

我在MongoDB中使用CakePHP更新。MongoDB:無法規範化查詢:BadValue投影不能混合包含和排除

當我寫下面的查詢它會執行得很好。

db.testData.find() 
{ "_id" : ObjectId("53d1f79db8173a625961ff3d"), "name" : "sadikhasan", "created" : ISODate("2014-07-25T06:22:21.701Z") } 

當我運行以下查詢來獲取唯一的名字,但它顯示錯誤,如

db.testData.find({},{name:1, created:0}) 
error: { 
    "$err" : "Can't canonicalize query: BadValue Projection cannot have a mix of inclusion and exclusion.", 
    "code" : 17287 
} 

當我運行以下查詢來獲取只有_id:0名字,那麼它執行好。

db.testData.find({},{name:1, _id:0}) 
{ "name" : "sadikhasan" } 

我qeustion是,當我在投影列表寫created:0爲什麼我收到錯誤。提前感謝您的幫助。

回答

41

不能混合納入和排除,對只有的例外是_id場。

例如,如果你有這樣的:

{ 
    "_id": ObjectId("53d1fd30bdcf7d52c0d217de"), 
    "name": "bill", 
    "birthdate": ISODate("2014-07-80T00:00:00.000Z"), 
    "created": ISODate("2014-07-25T06:44:38.641Z") 
} 

如果你想要的是 「名」 和 「生日」 你需要這樣做:

db.collection.find({},{ "_id": 0, "name": 1, "birthdate": 1 }) 

或者這樣:

db.collection.find({},{ "_id": 0, "created": 0 }) 

但不允許「混合」除「_id」之外的任何其他操作

db.collection.find({},{ "_id": 0, "name": 1, "created": 0 }) 

這也會產生一個錯誤。

這全部覆蓋在manual pages

+0

當我想投影列表,然後我總是通過'_id:0'? – Sadikhasan

+0

@Sadikhasan號。這只是排除默認情況下始終包含的「_id」字段。該示例中提供了一個鏈接,詳細解釋了這一點。與其他各種教程示例一起,您應該花點時間閱讀。 –

+0

他們爲什麼選擇這種設計的任何想法?在查詢中允許「太多」冗長是有道理的 – Richard

3

它引發錯誤「Can not canonicalize query:BadValue Projection can not be mixed with inclusion and exclusion。」因爲你正在混合包容和exlusion。 1表示包含,0表示排除。您可以在查詢中使用0或1。所以,如果你想看到的,也就是說,只有_id和name字段,使用可以使用: 1)入選:

   db.testdata.find({}, {_id:1,name:1}) 

或2)排除:

   db.testdata.find({},{created:0}) 

在上述兩種場景,它只會顯示_id和名稱字段。

+0

默認'_id:1'總是包含? – Sadikhasan

+0

是的,1是包含性的。所以它是fieldname:inlusion(1)/ exclusion(0)。 –

+0

感謝您的幫助。 – Sadikhasan