MongoDB:无法规范化查询:BadValue Projection不能混合使用包含和排除

Sad*_*san 33 mongodb mongodb-query

我是使用CakePHP在MongoDB中更新的.

当我写下面的查询时,它会执行得很好.

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

当我运行以下查询只获取名称但它显示错误时

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
}
Run Code Online (Sandbox Code Playgroud)

当我运行以下查询以获取只有名称时,name它执行良好.

db.testData.find({},{name:1, _id:0})
{ "name" : "sadikhasan" }
Run Code Online (Sandbox Code Playgroud)

我的qeustion是我name在投影列表中写错误的原因.提前感谢您的帮助.

Nei*_*unn 67

你不能混合包含和排除,唯一的例外是该_id字段.

例如,如果你有这个:

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

如果你想要的只是"名字"和"生日",你需要这样做:

db.collection.find({},{ "_id": 0, "name": 1, "birthdate": 1 })
Run Code Online (Sandbox Code Playgroud)

或这个:

db.collection.find({},{ "_id": 0, "created": 0 })
Run Code Online (Sandbox Code Playgroud)

但是不允许"混合"除"_id"之外的任何其他操作

db.collection.find({},{ "_id": 0, "name": 1, "created": 0 })
Run Code Online (Sandbox Code Playgroud)

这也会产生错误.

这些都包含在手册页中.


小智 5

它引发错误“无法规范化查询:BadValue Projection无法混合包含和排除。” 因为您要同时包含和排除内容。1表示包含,0表示排除。您可以在查询中使用0或1。因此,如果您只想看到_id和name字段,则use可以使用:1)包含:

              db.testdata.find({}, {_id:1,name:1})
Run Code Online (Sandbox Code Playgroud)

或2)排除:

              db.testdata.find({},{created:0})
Run Code Online (Sandbox Code Playgroud)

在上述两种情况下,它将仅显示_id和name字段。