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
    });