Dmitriy
если я ничего не путаю, то коллега хотел обновить данные с использованием af pipeline и $cond внутри. если я прав, то это делается примерно так:
db.getCollection("example_collection").updateOne(
{"_id": ObjectId("5e9373918cba124fb1d979db")},
[
{$set: {
"string": {$cond: [{$eq: ["$string", "value1"]}, "aaaa", "bbbb"]}
}}
]
)
Dmitriy
соответственно пример коллекции для которой я делал запрос выглядит так:
[{
"_id" : ObjectId("5e9373918cba124fb1d979d9"),
"string" : "value1",
"int" : NumberInt(1),
"float" : 11.11
},
{
"_id" : ObjectId("5e9373918cba124fb1d979da"),
"string" : "value2",
"int" : NumberInt(2),
"float" : 22.22
},
{
"_id" : ObjectId("5e9373918cba124fb1d979db"),
"string" : "value3",
"int" : NumberInt(2),
"float" : 33.33
}]
Anonymous
соответственно пример коллекции для которой я делал запрос выглядит так:
[{
"_id" : ObjectId("5e9373918cba124fb1d979d9"),
"string" : "value1",
"int" : NumberInt(1),
"float" : 11.11
},
{
"_id" : ObjectId("5e9373918cba124fb1d979da"),
"string" : "value2",
"int" : NumberInt(2),
"float" : 22.22
},
{
"_id" : ObjectId("5e9373918cba124fb1d979db"),
"string" : "value3",
"int" : NumberInt(2),
"float" : 33.33
}]
весь этот массив это отдельное поле
и нужно найти не по 1 условию, а по двум одновременно
Anonymous
тобишь
есть _документ_
{
my_filed: [
{ date: 1, type: A, something: 1 },
{ date: 1, type: b, something: 2 }
]
}
задача такая - у меня есть дата, тип, и something
мне нужно в массиве my_field найти элемент по дате и типу и сделать инкремент sommething
если такого элемента нет - вставить
написать условие только по дате получилось, а вот по дате и типу уже вопросики
Dmitriy
весь этот массив это отдельное поле
и нужно найти не по 1 условию, а по двум одновременно
это делается элементарно через $and (или $or в зависимости от потребностей) в $cond:
db.getCollection("example_collection").updateOne(
{"_id": ObjectId("5e9373918cba124fb1d979db")},
[
{$set: {
"string": {
$cond: [{$and: [{$eq: ["$string", "value1"]}, {$eq: ["$int", 1]}]}, "aaaa", "bbbb"]}}}
]
)
Dmitriy
попробуйте доку почитать
Anonymous
этот код не делает то, что я описал
Dmitriy
если вы ожидаете, что за вас напишут код, то это стоит денег
Dmitriy
вам дают подсказки, при помощи которых вы можете сделать нужное вам условие в update
Anonymous
так в этом моя проблема, я попросил как написать условие для вложенного массива в документе, а не на коллекции, как работает энд я и в доке вижу
Alexander
Здравствуйте, хочу попросить консультацию по поводу архитектуры приложения.
Я использую mongoose. Перед изменением документа мне нужно обязательно проверять определенные поля.
Проблема - дабл спендинг.
Может произойти ситуация, при которой 2 одинаковых транзакции полетят в базу данных, и в зависимости от результатов проверки - нужно принять только одну транзакцию.
Можно использовать хук типа
schema.pre('updateOne', {
document: true,
query: false
}, function() {
let document = await this.model.findOne(this.getQuery());
if (document.field) {
next()
} else {
return;
}
});
Так я получу документ перед его обновлением и проведу проверку. Проблема в том, что если 2 транзакции прилетели одновременно, то в обоих случаях в данном хуке выяснится, что состояние документа одно, после чего обе транзакции применятся. Потому что проверка будет происходить параллельно, а не последовательно. Можно ли как-то избежать такой ситуации?
Я имею ввиду именно на уровне базы данных, а не на уровне приложения.
Dmitriy
Здравствуйте, хочу попросить консультацию по поводу архитектуры приложения.
Я использую mongoose. Перед изменением документа мне нужно обязательно проверять определенные поля.
Проблема - дабл спендинг.
Может произойти ситуация, при которой 2 одинаковых транзакции полетят в базу данных, и в зависимости от результатов проверки - нужно принять только одну транзакцию.
Можно использовать хук типа
schema.pre('updateOne', {
document: true,
query: false
}, function() {
let document = await this.model.findOne(this.getQuery());
if (document.field) {
next()
} else {
return;
}
});
Так я получу документ перед его обновлением и проведу проверку. Проблема в том, что если 2 транзакции прилетели одновременно, то в обоих случаях в данном хуке выяснится, что состояние документа одно, после чего обе транзакции применятся. Потому что проверка будет происходить параллельно, а не последовательно. Можно ли как-то избежать такой ситуации?
Я имею ввиду именно на уровне базы данных, а не на уровне приложения.
если вам нужно блокировать документ до момента окончания каких-либо действий над ним, то стоит посмотреть в сторону транзакций: https://docs.mongodb.com/master/core/transactions/
Anonymous
Dmitriy
Dmitriy
не надо перекладывать с больной головы не здоровую
Anonymous
надеюсь таски вы так же не читаете, как мои условия)
Dmitriy
это я так понимаю вместо спасибо?
Anonymous
спасибо, но задачу я так и не решил)
Гена
Коллеги, доброе утро, вопрос такой - документация монги рекомендует использовать файловую систему xfs для WT.
Чем это обусловлено? как я понял, в случае многочисленных параллельных запросов на запись xfs лучше ext4.
Какие ваши рекомендации будут.
Стоит ли переходить с ext4 на xfs?
yopp
Гена
@dd_bb Можешь подсказать пожалуйста
Vadym
Добрый день, подскажите пожалуйста, как можно разделить записи по массиву внутри?
Before:
Row = 1, Cities = [1, 2]
After:
Row = 1, Cities = 1
Row = 2, Cities = 2
yopp
yopp
И ещё кейсы когда WT на ext4 вёл себя странно
yopp
Гена
https://jira.mongodb.org/browse/SERVER-18314
просто кроме того, что в документации рекомендуют xfs я ничего не нашел. Нашел парочку тестов, где говорят что xfs хорош ддля серверов с большим кол-вом ядер. Для любых других - нет смысла.
У нас затык в том, что на диск идет много параллельных записей, я так понимаю это и журналы в том числе, и диски при небольшой нагрузки на запись, но при большом кол-ве запросов в секунду страдают
Гена
а у нас шардированный кластер на ext4
yopp
С вероятностью 97% у вашего хранилища просто не хватает random iops под вашу нагрузку
Гена
что такое random iops
yopp
Если я правильно помню, у вас нжмд. А там 200 iops предел для 15k rpm sas
yopp
Случайные записи
Гена
нжмд?
yopp
НЖМД ограничены скоростью передвижения читающейся головки между секторам.
Если у вас много операций записи в разных местах, то хранилище большую часть времени будет тратить на перемещение, а не на запись
yopp
Накопители на жестких магнитных дисках
RusaXXX
Vadym
Igor
Подскажите пожалуйста куда копать. Пытаюсь сделать дамп, зависает на 101 документе...
Dumping collections from production database
2020-04-24T05:01:03.536+0300 writing AwsCloudHosts.HostProcessStates to
2020-04-24T05:01:04.595+0300 [........................] AwsCloudHosts.HostProcessStates 0/342237 (0.0%)
2020-04-24T05:01:07.595+0300 [........................] AwsCloudHosts.HostProcessStates 0/342237 (0.0%)
2020-04-24T05:01:10.595+0300 [........................] AwsCloudHosts.HostProcessStates 101/342237 (0.0%)
2020-04-24T05:01:13.595+0300 [........................] AwsCloudHosts.HostProcessStates 101/342237 (0.0%)
2020-04-24T05:01:16.595+0300 [........................] AwsCloudHosts.HostProcessStates 101/342237 (0.0%)
2020-04-24T05:01:19.595+0300 [........................] AwsCloudHosts.HostProcessStates 101/342237 (0.0%)
2020-04-24T05:01:22.595+0300 [........................] AwsCloudHosts.HostProcessStates 101/342237 (0.0%)
yopp
{ NeFFeX }
пол часа назад вроде норм работал, прихожу запускаю проект
{ NeFFeX }
получаю это, как пофиксить?
{ NeFFeX }
почему в личном кабинете в mongodb,может поменятся ip adress?
Гена
Коллеги, подскажите как стриггерить TTL индекс? он сам по себе работает? то есть я его создал и он начал работу?
Daniil
Daniil
но он удаляет не сразу, раз в какое то время запускает очистку
Гена
вроде какждую минуту сканирует
а удаляет когда?
Daniil
вроде какждую минуту сканирует
а удаляет когда?
“The background task that removes expired documents runs every 60 seconds. As a result, documents may remain in a collection during the period between the expiration of the document and the running of the background task.
Because the duration of the removal operation depends on the workload of your mongod instance, expired data may exist for some time beyond the 60 second period between runs of the background task.”
Daniil
т.е. как сканирует так и удаляет
Гена
ага
спасибо)
Moses
how to prevent duplicate values in mongoose schema but allow only null values ? i have set the field with unique:true ,but when i insert null values are treated as duplicates ,how can i allow null duplicated but prevent other values to be duplicated ?
Moses
Moses
help is appreciated!thanks
Daniil
Moses
Arsen
привет подскажите пожалуйста, могу ли я сделать lookup внутри lookup и где можно об этом почитать
Roman
Querying the dataset, how should the database be configured to search for specific fields
quickly?
○ Title
○ Author name
○ Publication date
Roman
Roman
Уникальные или не уникальные индексы строить?
Roman
Григорий
Всем привет, есть какая-нибудь хорошая инструкция как поднять mongo с шардированиям?
а если направите в сторону примера с ансибл, то вообще низкий поклон вам
Daniil
Артём
Сколько минимум оперативки(у vds) нужно для монго, чтобы она запустилась? А то помню там ограничения какие-то были
Yʉri 🇺🇦
Melodeiro
Артём
Да я так понял она под кеш резервирует просто
Mykola 🤷🏼♀️
на 500мб должно быть норм
Stan
Коллеги, добрый день!
Подскажите пожалуйста, не соображу.
Как объеденить эти два запроса так, чтобы на выходе присоединить поле категорий к найденному магазину?
const Shop = await this.shopModel.aggregate([
{
$match: { shop },
},
{
$lookup: {
from: 'products',
localField: 'shop',
foreignField: 'shop',
as: 'products',
},
},
])
const Categories = await this.productModel.aggregate([
{
$match:{ shop }
},
{
$project: { category: 1 }
},
{ $unwind: "$category" },
{ $group: {
_id: '$category' ,
count: { $sum: 1 }
}
}
])
Alex
Всем привет, в монгодб можно как-нибудь upsert many сделать? Что-то в гугле 0 информации
Daniil
Alex
Кароче подумаю еще🤪
Григорий
Александр
Я тут недавно читал про миграции в монге, может кто просветит, зачем она если это докоментная бд?
Daniil
Natalia
Добрый день! Посоветуйте пожалуйста курсы по монгодб с нуля (желательно с примерами на Node.js/mongoose)