Dmitry
Всем привет.
Нужна помощь.
есть елемент
{ field1:value,
field2:value
feeld3: [{ subField: value,
subField2:[ value1, value2,...valueN]
}
надо вывести field1, field2, а с field3 объект содержащий максимальное значение в массиве subField2. Максимум среди всех объектов в поле field3. Если таких объектов несколько, то любой
Можно восользоваться $map, $size, $arrayToObject, $max. https://docs.mongodb.com/manual/reference/operator/aggregation/size/ https://docs.mongodb.com/manual/reference/operator/aggregation/max/ https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/ https://docs.mongodb.com/manual/reference/operator/aggregation/map/
через $map и $size прогоняем feeld3 и создаем массив массивов. Где первый элемент это исходный массив, а второй элемент его размер. Потом создаем из него объект через $arrayToObject где ключом будет размер массива, а значением массив.
+ также создаем еще одно поле, где будет массив размеров массивов. В этом массиве берем $max и подставляем его значение в получившийся объект раннее.
Громоздко но сработать должно
Viktar
Звучит архи сложно)) проще наверное вынести эту логику из монги.
yopp
{'residentsCount': 8,
'knownResidents': [
{
'state': 'ak',
'city': 'anchorage',
'personId': ObjectId('563a1583a219445d52289d0f'),
'years': [
2016,
2017,
2018,
2019,
2020,
2006,
2014,
2015
]
},
{
'state': 'ak',
'city': 'soldotna',
'personId': ObjectId('563a1588a219445d5228c143),
'years': [
2002,
1998
]
}
}
пример реальных данных. надо найти объект с макс years
$reduce
yopp
Сохраняете в аккумулятор самое большое из найденых значений
yopp
Сравнивая текущее значение с значением в аккумуляторе
Viktar
Сравнивая текущее значение с значением в аккумуляторе
вроде получилось
aggregate([
{'$geoNear': {
'near': {'type': "Point", 'coordinates': one['loc_mdb']},
'distanceField': "distance",
'maxDistance': 1603,
'query': {},
'includeLocs': "loc",
'spherical': True
}
},
{'$limit': 50},
{'$project': {'_id': 0, 'id': '$_id', 'knownResidents': 1, "street": 1, "streetSuffix": 1, "houseNumber": 1,
"zip": 1, "zip4": 1, "residentsCount": 1, 'distance': 1, 'loc': 1,
'res': {'$reduce':
{'input': "$knownResidents",
'initialValue':1,
'in': {
'$cond': [{'$gte': ["$$this.years", "$$value.years"]}, "$$this", "$$value"]}}
}
}}
])
питоновский код
Viktar
Спасибо
Bogdan
Подскажите пожалуйста, как применить regex для ObjectId? Гугл до дыр затер, все примеры на других полях, что по аналогии не работает с ObjectId
yopp
yopp
То что вы видите в виде hex символов это репрезентация значения, а не само значение. Вероятно сработают escape последовательности, типа \xDA
Bogdan
Понял, спасибо большое
Bogdan
yopp
Вам необходимо явно передавать значение для оператора в типе ObjectId
Bogdan
Я так и делаю, тут уже без регулярок, точное значение передаю для ObjectId и другого поля
Dezmunt
Вопрос, хочу чекать изменения через watch. Вот повесил я обработчик, но допустим я хочу его удалить, как это сделать? (mongoose)
Dezmunt
Евгений
всем привет, подскажите как отсортировать правильно
Евгений
Levon
Добрый день
Подскажите пожалуйста как можно сделать сортировку по двум полям ? В документации нет того, что мне нужно.
Есть коллекция продуктов. Нужно сделать сортировку по цене и по количеству. Но нужно товары сначало сортировать по цене, а потом чтобы товары которые не в наличии, шли после тех которые в наличии.
Есть идеи ?
Vladislav
Dezmunt
как запустить несколько реплик в фоне? А то получается я на стандарном порту примари запустил, надо еще две секондари
Viktar
для каждой реплики прописываете свой конфиг и запускаете
Dezmunt
А, ну ок
Pavel
ребята, у меня есть коллекция с пользователями, я хочу оттуда извлечь 2 поля, подскажите как сделать. P.S схемы с этими пользорвателями нету
Pavel
в голоу лезет вариант с "ref", но для него нужна схема
Pavel
без схемы реально сделать?
Pavel
а можно полчить доступ к коллекции без схемы?
Joe
Joe
Только не понятно что имеется и что нужно получить в итоге
Pavel
Joe
а как?
Ванговать влом) мб покажешь что уже есть)
Pavel
ну типа есть коллекция, как я уже говорил из нее нужно извлечь 2 поля. Я спрашиваю можно ли это сделать не создавая схему для этой коллекции
Pavel
понятно в чем вопрос?
WolderVsrat
Кажется, что стандартным getCollection это без проблем достается
Тут так понимаю имеет место быть mongoose , конкретно для него не смогу подсказать
Vladislav
Pavel
спасибо
Pavel
Евгений
а кто-то может подсказать как правильно протолкнуть дальше по пайплайну коллекцию $addToSet и раскрутить чтобы посчитать сумму?
Nikita
привет. кто-н знает, как решить проблему медленной выгрузки данных из mongodb?
есть коллекция, в ней десятки миллионов документов. мы запрашиваем 10 тысяч документов db.endpoints_results.find().limit(10000) и это занимает 40 секунд
Bogdan
Евгений
смотря как это раскручивает фронт, если это в таблицу, то выборка делается по 50-100 доков и таблица на фронте адаптируется, либо сужать поиск и количество полей
Anonymous
Bogdan
10кб
Если не нарушает логику приложения, попробуйте использовать стримы при выборке
Bogdan
10кб
Как вариант, потестируйте значение .limit().batchSize(1-100000)
Anonymous
Хорошо, спасибо
Bogdan
nodejs
let cursor = db.endpoints_results.find().limit(10000)
cursor.on("data", async function (data) {
// событие на каждый новый документ
});
cursor.on("end", async function () {
// событие по окончании выборки
});
Bogdan
А в чем ошибка? Не обновляет?
Bogdan
Попробуйте на идентичных данных в песочнице
İskender
Вопрос к тем, кто хранит bcrypt hash в монго. Можно ли искать по этому хэшу? Знаю, что для сравнения хэша нужно использовать bcrypt.compare(plainTextPassword, hash), т.е. лучше искать документ по другому ключу и сравнивать хэш. А может ли этот хэш быть единственным фильтром для поиска?
Melonges
Есть смысл десктопную версию монги качать или в браузерной есть все тоже самое?
StaniFe
можно сделать set через foreach и $slice. Погугли, там куча примеров
Melonges
Как лучше подключать mongo? Через монгус или так https://metanit.com/web/nodejs/6.1.php
StaniFe
Это просто медленный вариант исполнения задачи. Про slice ничего особо не скажу, так как не углублялся в этот вопрос.
yopp
inventory.0.isActive
https://docs.mongodb.com/manual/core/document/#dot-notation
AI
Народ, прошу совета
Работаю над архитектурой приложения сейчас
Есть посты, у поста есть поле с тегами
И есть сущности, каждой сущности присвоен свой тег
Так вот вопрос, теги у поста лучше сделать массивом или строкой? Как монга будет быстрее поиск делать? по массиву через $in или по вхождению строки, как то паттерном ?
Roman Khonichev
через массив
Ilya
В рамках транзакции произвожу вставку большой пачки документов в одну определенную коллекцию, скажем, около двух-трех тысяч. Транзакция успешно завершается. Однако сразу после транзакции я запрашиваю все вставленные документы методов find, и мне ничего не возвращается. Почему я при запросе "свежевставленных" документов, которые вставились в процессе транзакции, в ответ получаю пусто? Запрос этот делаю сразу после того, как завершается транзакция.
Все это происходит на Replica Set из 3-х нод. Параметры транзакции: readConcern - snapshot, writeConcern - majority, readPreference - primary.
В чем проблема, хоть убей не пойму. Прям магия какая-то.
Отмечу еще пару любопытных моментов. Когда я запускаю транзакцию, отслеживаю состояние через Robo 3T. И там все документы сразу появляются без проблем после транзакции. Кроме того, если после транзакции не сразу запрашивать find, а через setTimeout в 1 секунду, то все документы вернутся.
Такое впечатление, будто монговские транзакции не очень то и ACID. О какой durability может идти речь, если после успешного коммита я не могу сразу получить вставленные документы?
Артем
Чтение происходит с праймари? Просто запись не сразу по репликам распространяется
Andrey
В рамках транзакции произвожу вставку большой пачки документов в одну определенную коллекцию, скажем, около двух-трех тысяч. Транзакция успешно завершается. Однако сразу после транзакции я запрашиваю все вставленные документы методов find, и мне ничего не возвращается. Почему я при запросе "свежевставленных" документов, которые вставились в процессе транзакции, в ответ получаю пусто? Запрос этот делаю сразу после того, как завершается транзакция.
Все это происходит на Replica Set из 3-х нод. Параметры транзакции: readConcern - snapshot, writeConcern - majority, readPreference - primary.
В чем проблема, хоть убей не пойму. Прям магия какая-то.
Отмечу еще пару любопытных моментов. Когда я запускаю транзакцию, отслеживаю состояние через Robo 3T. И там все документы сразу появляются без проблем после транзакции. Кроме того, если после транзакции не сразу запрашивать find, а через setTimeout в 1 секунду, то все документы вернутся.
Такое впечатление, будто монговские транзакции не очень то и ACID. О какой durability может идти речь, если после успешного коммита я не могу сразу получить вставленные документы?
Не понятно, вы в робо 3т видите документы, а из кода нет?
Ilya
Не понятно, вы в робо 3т видите документы, а из кода нет?
Ага, и это как раз происходит, видимо, из-за того, что документы "появляются" и "становятся видимыми" для обычных запросов спустя некотрое количество мс после коммита транзакции. Поэтому когда я обновляю робо 3т, то там они уже успевают появится.
Вопрос тут в acid принципах, Durability же вроде должно гарантировать, что если коммит произошел, то изменения уже железно находятся в базе.
Ilya
Возможно, дело в том, что как раз в рамках транзакции большое кол-во документов вставляются. Но тогда вопрос, как мне быть, и какие у меня гарантии тогда?
Andrey
А спустя время в робо видны документы?
Ilya
А спустя время в робо видны документы?
Да, спустя время в робо документы появляются. Да и для запроса с бэкенда они тоже появляются. Причем время это весьма маленькое, думаю, в районе 500 мс после коммита на вскидку.
Ilya
Проблема то была как раз в том, что СРАЗУ после коммита мне нужно обратиться к вставленным транзакционно документам. А из-за вот такого казуса не могу это сделать.
Andrey
то есть через 0.5 секунду и вставки нескольких тысяч документов - документы становятся доступны...тогда что не так
Ilya
Не совсем так. 0.5 секунд происходит спустя после коммита. В чем же тогда смысл транзакции, если после коммита состояние базы не консистентно?
Ilya
У меня на самом деле есть один вариант - сразу после транзакции рекурсивно вызывать метод find по вставленным докам, пока он не вернет наконец не пустой ответ, таким образом "дожидаться", и потом уже идти дальше по коду
Ilya
но это как то совсем костыльно
WolderVsrat
По идее с majority и snapshot данные и правда должны быть доступны после коммита, по крайней мере документация это описывает. Все же похоже, что не совсем нормальное поведение. (Это правда не совсем к durability, а к consistency, но это так, отступление)
Хотя я в транзакциях несколько тысяч доков обычно не фигачил, может особенность растечки данных по репликам
WolderVsrat
Можно начать с глупых причин
Чисто теоретически, может быть такое, что запрос на чтение выполняется раньше окончания или даже начала транзакции (то есть надо в коде попробовать поиграться)
А давая задержку на выполнение, как раз появляется шанс, что чтение будет уже после коммита
Но это так, догадки на кофейной гуще
Ilya
yopp
В рамках транзакции произвожу вставку большой пачки документов в одну определенную коллекцию, скажем, около двух-трех тысяч. Транзакция успешно завершается. Однако сразу после транзакции я запрашиваю все вставленные документы методов find, и мне ничего не возвращается. Почему я при запросе "свежевставленных" документов, которые вставились в процессе транзакции, в ответ получаю пусто? Запрос этот делаю сразу после того, как завершается транзакция.
Все это происходит на Replica Set из 3-х нод. Параметры транзакции: readConcern - snapshot, writeConcern - majority, readPreference - primary.
В чем проблема, хоть убей не пойму. Прям магия какая-то.
Отмечу еще пару любопытных моментов. Когда я запускаю транзакцию, отслеживаю состояние через Robo 3T. И там все документы сразу появляются без проблем после транзакции. Кроме того, если после транзакции не сразу запрашивать find, а через setTimeout в 1 секунду, то все документы вернутся.
Такое впечатление, будто монговские транзакции не очень то и ACID. О какой durability может идти речь, если после успешного коммита я не могу сразу получить вставленные документы?
У find какой readConern?
yopp
yopp
Посмотрите что в explain. Возможно ваш запрос не покрывается создаными индексами
yopp