#mongodb #mongodb-query #aggregation-framework
Вопрос:
Представьте, что в моей коллекции были следующие документы
{'name':'toothpaste','price':'{"currency":"USD","value":17}'}
{'name':'laptop','price':'{"currency":"EUR","value":1080}'}
и я хочу запросить документы, валюта цены которых составляет доллары США, а значение цены меньше 100 в одном запросе.
Пожалуйста, помните, что столбец price содержит строку JSON и не является встроенным объектом
Ответ №1:
Чтобы использовать пользовательскую функцию в своем запросе, ознакомьтесь с оператором $function платформы агрегирования. Это новая функция Mongo >= 4.4 (спасибо @Victor)
Что касается вашего запроса, вы можете сделать что-то вроде этого:
db.items.find({"$expr": { "$function": {
body: function(price) {
const parsed = JSON.parse(price);
return parsed.currency === "USD" amp;amp; parsed.value <= 100
},
args: ["$price"],
lang: "js"
} }})
Я выяснил одну вещь: вы должны сохранить строку JSON в двойных кавычках (что вы делаете правильно), чтобы функция JSON.parse() работала правильно
Протестируйте код с помощью веб-оболочки mongo здесь
>>> db.items.insertMany([ { "name": "toothpaste", "price": '{"currency":"USD","value":17}' }, { "name": "laptop", "price": '{"currency":"EUR","value":1080}' } ])
>>> db.items.find({"$expr": { "$function": {
body: function(price) {
const parsed = JSON.parse(price);
return parsed.value === 17
},
args: ["$price"],
lang: "js"
} }})
Комментарии:
1. Новинка с 4.4. Аккуратно!