2014-08-30 1 views
1

запрос является:

{$and:[ 
    {phone:phone}, 
    {$gte:{date:'2014-08-25'}}, 
    {$lt:{date:'2014-08-30'}} 
]} 

, а затем он показывает ошибку:

{ [MongoError: Can't canonicalize query: BadValue unknown top level operator: $gte] name: 'MongoError' } 

Каков смысл этой ошибки?

ответ

3

вся ваша структура запросов не является правильным на самом деле. Операторы действуют в «полях» в форме аргумента. Таким образом, оператор является «значением» поля как «ключ» в манере речи.

Помимо этого все запросы «MongoDB» на самом деле являются неявным «запросом». Сам оператор $and требуется только там, где вы указываете несколько условий для одного и того же поля. Но это не так, как вы делаете «диапазон запроса» с $gte и $lt операторов, а вы «объединить» их в том же «оператора документа»:

db.collection.find({ 
    "phone": phone, 
    "date": { "$gte": "2014-08-25", "$lte": "2014-08-30" } 
}) 

Также стоит отметить здесь, что это работает только, когда ваш даты на самом деле являются «строками». То, что вы на самом деле «должны» иметь это «дата объекты» в вашей коллекции, которые обычно представляют в оболочке, как так:

ISODate("2014-08-29T17:51:30.428Z") 

Это поможет вам значительно, как вы можете делать другие вещи, с датами и так же не нужны «конвертировать» их для любых других манипуляций в вашем коде. Если у вас есть реальные «объекты даты», то вы запрашиваете их просто с помощью других экземпляров даты объекта следующим образом:

db.collection.find({ 
    "phone": phone, 
    "date": { "$gte": new Date("2014-08-25"), "$lte": new Date("2014-08-30") } 
}) 
+0

точно, я думаю, что все больше людей должны понимать, что MongoDB запросы не JSON, но BSON: HTTP://docs.mongodb.org/manual/reference/bson-types/ – fstab