node.js - MongoError: невозможно канонизировать запрос: BadValue, массив неверного порядка [2]

У меня есть база данных со следующей структурой документа:

{
    "_id" : ObjectId("520bea012ab230549e749cff"),
    "Day" : 1,
    "Time" : 54,
    "State" : "Vermont",
    "Airport" : "BTV",
    "Temperature" : 39,
    "Humidity" : 57,
    "Wind Speed" : 6,
    "Wind Direction" : 170,
    "Station Pressure" : 29.6,
    "Sea Level Pressure" : 150
}

Мне нужно найти самую высокую «температуру» для каждого «штата» (например, есть 100 документов с «State»: «Vermont») и добавить в этот документ запись «month_high»: true (которая имеет самую высокую температуру)

Вот мой код: http://pastebin.com/UbACLbSF

Но когда я запускаю программу в оболочке, я получаю следующую ошибку:

MongoError: невозможно канонизировать запрос: BadValue, массив неверных порядков [2]


person Dennis    schedule 14.08.2015    source источник


Ответы (2)


Вы должны передавать объект, а не массив

cursor.sort({"State": 1, "Temperature": -1});
person Yuri Zarubin    schedule 15.08.2015
comment
этот вариант вызывает ошибку - TypeError: невозможно прочитать свойство State со значением null - person Dennis; 15.08.2015
comment
Ну это другая ошибка в другой части приложения. Похоже, у вас, вероятно, есть документ, у которого нет свойства «Состояние», поэтому, когда вы пытаетесь выполнить сравнение, вы получаете сообщение об ошибке. - person Yuri Zarubin; 15.08.2015
comment
нет ... Свойство 'State' есть в каждом документе ... Я проверил ... Я вставил код - console.dir (doc) в цикл и получил все документы с этим свойством ... кажется, я начинаю понимать проблема ... callback cursor.each возвращает 'null' ... но я не понимаю, как это влияет на производительность цикла ... - person Dennis; 17.08.2015
comment
Этот ответ неверен относительно драйвера Node.js. Вам нужно использовать массив, а не объект json, чтобы сохранить порядок сортировки. В документации не все так однозначно. об этом, но есть это официальное обучающее видео. - person Zanon; 18.08.2015

Вам просто нужны «Состояние» и «Температура», верно? Так что попробуйте спроецировать его перед сортировкой. Я протестировал следующий код, и он сработал:

var query = {};
var projection = { 'State':1, 'Temperature':1 };
var options = { 'sort' : [['State',1], ['Temperature',-1]] };

var cursor = db.collection('data').find(query, projection, options);
person Zanon    schedule 18.08.2015