2014-07-25 7 views
23

Jestem nowsza w MongoDB z CakePHP.MongoDB: Nie można kanonicznie sformułować zapytania: Projekcja BadValue nie może mieć kombinacji włączenia i wyłączenia

Kiedy piszę kolejne zapytanie, będzie ono działać bardzo dobrze.

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

Kiedy uruchomić następujące zapytanie aby uzyskać tylko nazwę, ale to pokazuje błąd jak

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 
} 

Kiedy uruchomić następujące zapytanie aby uzyskać tylko wymienić z _id:0 to dobrze wykonać.

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

Moja qeustion to dlaczego ja dostaję błąd, gdy piszę created:0 w liście projekcji. Dzięki za pomoc z góry.

Odpowiedz

41

Nie można mieszać włączenia i wyłączenia, wyjątek tylko jest pole _id.

Na przykład, jeśli masz to:

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

Jeśli chcesz to "imię" i "Data urodzenia" trzeba to zrobić:

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

Albo to:

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

Ale nie można mieszać żadnych innych operacji poza "_id"

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

To również spowoduje błąd.

Wszystko to obejmuje manual pages.

+0

Kiedy chcę listę projekcji, zawsze przekazuję '_id: 0'? – Sadikhasan

+0

@Sadikhasan No. To jest po to, aby wykluczyć pole "_id", które zawsze jest domyślnie włączone. W przykładzie podano łącze, które wyjaśnia bardziej szczegółowo. Wraz z różnymi innymi przykładami samouczków powinieneś poświęcić trochę czasu na czytanie. –

+0

pomysł, dlaczego wybrał ten projekt? Rozsądnie jest pozwolić na bycie "zbyt" pełnym gadaniem w zapytaniach – Richard

3

Występuje błąd "Nie można kanonicznie sformułować zapytania: BadValue Projekcja nie może być mieszanką włączenia i wyłączenia." ponieważ mieszacie zarówno włączanie, jak i wyłączanie. 1 oznacza włączenie, a 0 oznacza wykluczenie. Możesz użyć 0 lub 1 w zapytaniu. Tak więc, w przypadku, gdy chcesz zobaczyć, powiedzmy, tylko pola _id i nazwisko, stosowanie może albo zastosowanie: 1) Włączenie:

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

lub 2) Wyłączenie:

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

W obu powyższych scenariusze, pokaże tylko _id i pole nazwy.

+0

Domyślne "_id: 1" jest zawsze włączone? – Sadikhasan

+0

Tak, 1 jest do włączania. Jest to nazwa pola: inlusion (1)/exclusion (0). –

+0

Dzięki za pomoc. – Sadikhasan

Powiązane problemy