Сегментация по структуре профиля
Для комплексной сегментации профилей по JSON-полям вы можете сформировать запросы к MongoDB. Такие запросы описываются в EJSON-форме.
Чтобы построить запрос, выберите отбор по Структуре проф иля. Условие отбора — EJSON Запрос:
Операторы
Для расширенного JSON запроса к базе данных используются различные операторы.Подробнее о EJSON для MongoDB читайте в документации. Ниже мы разберем синтаксис основных операторов.
Допустим, в базе есть профиль с дополнительным JSON-поле list
:
В это поле записан следующий массив:
[
{
"contract_id": 10,
"category": "A",
"payment": 1000
}
]
В таблицах показаны запросы, которые позволят выбрать данный профиль из базы:
Операторы сравнения
Оператор | Описание | Пример |
---|---|---|
$eq | Равно | { |
$ne | Не равно | { |
$gt | Больше | { |
$gte | Больше или равно | { |
$lt | Меньше | { |
$lte | Меньше или равно | { |
$in | Соответствует хотя бы одному значению в массиве | { |
$nin | Не соответствует ни одному значению в массиве | { |
Логические операторы
Оператор | Описание | Пример |
---|---|---|
$and | Соответствует всем указанным в массиве условиям | { |
$not | Не соответствует указанному условию | { |
$or | Соответствует хотя бы одному из указанных в массиве условий | { |
$nor | Не соответствует ни одному из указанных в массиве условий | { |
Оператор $elemMatch
Оператор $elemMatch
позволяет выбрать профили, у которых массив, хранящийся в JSON-поле, содержит хотя бы один элемент, удовлетворяющий всем условиям.
Профиль#1 | Профиль#2 |
---|---|
|
|
Запрос выберет Профиль#1 и Профиль#2:
{
"list.category": "B",
"list.payment": 2000
}
Запрос выберет только Профиль#1:
{
"list": {
"$elemMatch": {
"category": "B",
"payment": 2000
}
}
}
Возможно сравнение только простых типов данных. Нельзя сравнивать сложные типы (объект, массив), так как не гарантируется сохранение порядка полей в запросе и в самой базе профилей.
Пример недопустимого сравнения:
// Сравнение JSON-поля профиля "list"
{
"list": {
"$eq": {
"contract_id": 10,
"category": "A",
"payment": 1000
}
}
}
Вместо сравнения целых объектов, лучше использовать сравнение по ключам и их значениям. Например:
{
"list.category": {
"$eq": "A"
}
}
Даты
Для текущей даты используйте {"$dateNowFunc": "0"}
. Аргумент позволяет задать смещение даты в днях.
Запрос выберет профили, обновленные не позднее чем вчера:
{
"_updatetime": {
"$gte": {
"$dateNowFunc": "-1"
}
}
}
Также можно использовать эту функцию для работы с датами, записанными в JSON-поле. Например, в дополнительное поле профиля "list"
записан следующий массив:
"list":
[
{
"contract_id":10,
"category": "A",
"start_date":"2022-07-01",
"expiration_date":"2022-08-01"
},
{
"contract_id":20,
"category": "B",
"start_date":"2022-06-15",
"expiration_date":"2022-09-15"
}
]
Запрос выберет профили, с которыми договор категории "A" был заключен не раньше чем неделю назад:
{
"list": {
"$elemMatch": {
"category": "A",
"start_date.r": {
"$gte": {
"$dateNowFunc": "-7"
}
}
}
}
}
Запрос выберет профили с договором категории "B", который истекает меньше чем через месяц:
{
"list": {
"$elemMatch": {
"category": "B",
"expiration_date.r": {
"$lte": {
"$dateNowFunc": "30"
}
}
}
}
}
Обратите внимание, дни рождения, даты регистрации, а также даты, записанные в дополнительные поля, хранятся в платформе в следующем виде:
"date" : {
"r" : ISODate("2020-09-30T07:42:30.501Z"),
"y" : 2020,
"m" : 9,
"d" : 30,
"md" : 930,
"ymd" : 20200930
}
Когда вы прописываете путь к такому полю, добавьте дополнительный ключ — date.r
.