#node.js #mongodb
#node.js #mongodb
Вопрос:
Что не так с приведенным ниже кодом?
db.get().collection('bars').findAndModify({
barID: req.body.button
},{
$push: {
usersfbID: req.body.profileUser[0].facebookID,
usersDocID: req.body.profileUser[0]._id
}
},{
new: true
}, function(err, doc){
if(err){
throw err;
}if(doc){
console.log('Existing document updated successfully');
console.log(doc);
}
});
Я всегда получаю одну и ту же ошибку,
Ошибка MongoError: исключение: nextSafe(): { $ err: «Не удается канонизировать запрос: неверное значение, спецификация плохой сортировки», код: 17287 }
Что я делаю не так? Я неправильно использую оператор $ push? Нужно ли указывать кавычки вокруг некоторых пар ключ-значение? Этот метод findAndModify сводит меня с ума. Я абсолютно понятия не имею, что я делаю не так.
Примечание: я рассмотрел другие вопросы по SO, касающиеся findAndModify, но ни одно из этих решений не работает для меня. Я уверен, что это небольшая ошибка, касающаяся синтаксиса функции.
Ответ №1:
findAndModify
Метод имеет следующую подпись
findAndModify(query, sort, doc, options, callback)
где
query
<object>
: Объект запроса для определения местоположения объекта для изменения.sort
<array>
: Если несколько документов совпадают, выберите первый в указанном порядке сортировки в качестве объекта для манипулирования.doc
<object>
: Поля / значения, подлежащие обновлению.options
<object>
необязательно: Дополнительные настройки.
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что sort
спецификация отсутствует, и вместо этого она считывает обновление doc
в качестве sort
параметра.
Вам нужно указать параметр сортировки следующим образом:
db.get().collection('bars').findAndModify(
{ "barID": req.body.button }, // query
[ ["barID", 1] ], // sort
{
"$push": { // doc
"usersfbID": req.body.profileUser[0].facebookID,
"usersDocID": req.body.profileUser[0]._id
}
},
{ "new": true }, // options
function(err, doc){ // callback
if (err){
throw err;
} else if(doc){
console.log('Existing document updated successfully');
console.log(doc);
}
}
);
Комментарии:
1. Ладно, это сработало. Большое спасибо! Вы были правы, мне просто не хватало параметра сортировки. Я думал, что это необязательный параметр, но, видимо, это не так. Кроме того, могу ли я вставить новый документ с помощью findAndModify, установив значение upsert: true?
2. @ZaidHumayun Да, если
upsert
для параметра установлено значение true, mongo создает новый документ, если ни один документ не соответствует критериям запроса. Значение по умолчанию равно false, которое не вставляет новый документ, если совпадение не найдено.