web-dev-qa-db-fra.com

MongoDB: impossible de canoniser la requête: BadValue Projection ne peut pas avoir un mélange d'inclusion et d'exclusion

Je suis plus récent dans MongoDB avec CakePHP.

Lorsque j'écris la requête suivante, elle s'exécute très bien.

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

Lorsque j'exécute la requête suivante pour obtenir uniquement le nom, mais il affiche une erreur comme

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
}

Lorsque j'exécute la requête suivante pour obtenir uniquement le nom avec _id:0 puis il s'exécute bien.

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

Ma qeustion est la raison pour laquelle je reçois une erreur lorsque j'écris created:0 dans la liste de projection. Merci d'avance pour votre aide.

32
Sadikhasan

Vous ne pouvez pas mélanger inclusion et exclusion, l'exception uniquement est _id champ.

Par exemple, si vous avez ceci:

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

Si tout ce que vous voulez, c'est le "nom" et la "date de naissance", vous devez le faire:

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

Ou ca:

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

Mais il n'est pas autorisé de "mélanger" d'autres opérations que "_id"

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

Cela produirait également une erreur.

Tout cela est couvert dans les pages de manuel .

63
Neil Lunn

Il génère l'erreur "Impossible de canoniser la requête: BadValue Projection ne peut pas avoir un mélange d'inclusion et d'exclusion." parce que vous mélangez à la fois l'inclusion et l'exclusion. 1 signifie inclusion et 0 signifie exclusion. Vous pouvez utiliser 0 ou 1 dans votre requête. Donc, si vous souhaitez voir, disons, uniquement les champs _id et name, use peut utiliser soit: 1) Inclusion:

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

Ou 2) Exclusion:

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

Dans les deux scénarios ci-dessus, il affichera uniquement le champ _id et le nom.

5
Bipul Sinha

En termes simples pour décrire la solution, vous pouvez indiquer à MongoDB quels sont tous les champs que vous voulez ou que vous ne voulez pas de MongoDB.

ce qui signifie que dans la méthode de sélection, vous ne devez mentionner que les champs obligatoires ou non obligatoires. comme ci-dessous

find({<!--query here--!>}).select({

        password: 0,
        allowed_ip: 0,
        username: 0,
        password: 0,
        __v: 0,
        _id: 0
    });

Il devrait être soit zéro (exclusions/non requis) ou un (inclusions/champs obligatoires.) Bravo !!!

0
SuRa