могу ли я проанализировать JSON в запросе базы данных mongo?

#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. Аккуратно!