MongoDB "$" сам по себе не является допустимым FieldPath при использовании конвейерных линий агрегации в операции обновления - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь выполнить операцию обновления с использованием конвейеров агрегации в проекте Node.js с mon goose. Вот мой код:

// Model schema
let productSchema = new Schema({
    name: { type: String, required: true },
    description: { type: String, required: false },
    currency: { type: String, required: false },
    price: { type: Number, required: true },
    createdAt: { type: Date, default: Date.now, required: true },
    updatedAt: { type: Date, required: false },
    tags: [String],
});

// Update operation
module.exports.update = async (product) => {

    await productModel.findByIdAndUpdate(product._id,
        [{
            $set:
            {
                name: product.name,
                description: product.description,
                currency: product.currency,
                price: product.price,
                updatedAt: '$$NOW',
                tags: { $concatArrays: [ '$tags', product.newTags  ] }
            }
        }],
        { 
            runValidators: true
        });
}

Когда я выполняю функцию обновления, я получаю следующую ошибку:

{
    "ok": 0,
    "errmsg": "'$' by itself is not a valid FieldPath",
    "code": 16872,
    "codeName": "Location16872",
    "name": "MongoError"
}

Node.js версия: 12.13

Версия MongoDB: 4.2.6

1 Ответ

1 голос
/ 06 мая 2020

Оказывается, значение, которое я получал в product.currency, было «$», и это было причиной ошибки. Чтобы исправить это, мне пришлось использовать оператор $literal, чтобы завершить product.currency, например:

module.exports.update = async (product) => {

    await productModel.findByIdAndUpdate(product._id,
        [{
            $set:
            {
                name: product.name,
                description: product.description,
                currency: { $literal: product.currency }, // <--- here!
                price: product.price,
                updatedAt: '$$NOW',
                tags: { $concatArrays: [ '$tags', product.newTags  ] }
            }
        }],
        { 
            runValidators: true
        });
}

Согласно официальным документам MongoDB на $literal:

Возвращает значение без синтаксического анализа. Используйте для значений, которые конвейер агрегации может интерпретировать как выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...