MongoDB: не удается выполнить канонизацию запроса: BadValue Projection не может содержать сочетание включения и исключения
Я новичок в MongoDB с CakePHP.
Когда я напишу следующий запрос, он выполнится очень хорошо.
db.testData.find()
{
"_id" : ObjectId("53d1f79db8173a625961ff3d"),
"name" : "sadikhasan",
"created" : ISODate("2014-07-25T06:22:21.701Z")
}
Когда я запускаю следующий запрос, чтобы получить только name
, он возвращает ошибку:
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
}
Когда я запускаю следующий запрос, чтобы получить только name
с _id:0
, он выполняется хорошо:
db.testData.find({},{name:1, _id:0})
{ "name" : "sadikhasan" }
Мой вопрос: почему я получаю ошибку, когда пишу created:0
в списке проекций. Спасибо за помощь заранее.
Ответы
Ответ 1
Вы не можете смешивать включение и исключение, единственным исключением является поле _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 })
Это также приведет к ошибке.
Все это описано на страницах руководства.
Ответ 2
Это бросает ошибку "Can canicalize query: BadValue Projection не может иметь сочетание включения и исключения". потому что вы смешиваете как включение, так и исключение. 1 означает включение, а 0 означает исключение. Вы можете использовать либо 0, либо 1 в запросе. Итак, если вы хотите видеть, скажем, только поля _id и name, использование может либо использовать: 1) Включение:
db.testdata.find({}, {_id:1,name:1})
Или 2) Исключение:
db.testdata.find({},{created:0})
В обоих вышеперечисленных сценариях будет отображаться только поле _id и name.
Ответ 3
Простыми словами, чтобы описать решение, вы можете указать MongoDB, какие поля вы хотите или не хотите из MongoDB.
Это означает, что в методе выбора вы должны указать только обязательные или не обязательные поля. как ниже
find({<!--query here--!>}).select({
password: 0,
allowed_ip: 0,
username: 0,
password: 0,
__v: 0,
_id: 0
});