Сергей
по части слова
Dmitriy
как в js составить query я хз, но вам надо создать query с regex и передать его в find
Сергей
Dmitriy
с input вы получаете данные, т.е. некую строку текста, из которой вам надо составить запрос к монге
Dmitriy
если говорить чисто про mongo shell, то запрос выглядил бы так:
db.Foremans.find({"name": {$regex: /.*789.*/i}})
Alexey
Привет, коллеги. Вопрос. Можно ли шардировать MongoDB так, чтобы на каждом шарде хранилось 2/3 данных? То есть данные делятся на три равные части: А, B и C. На первом шарде хранятся данные А и В, на втором - В и С, на третьем - А и С. То есть в случае падения одного шарда, все данные, так или иначе, доступны.
Сергей
Dmitriy
через $or)
db.Foremans.find({$or: [{"name": {$regex: /.*789.*/i}, {"surname": {$regex: /.*789.*/i}, {"patronymic": {$regex: /.*789.*/i}]})
Сергей
Сергей
пошел читать про $regex
Dmitriy
в объект оберните весь запрос
Dmitriy
так же как я выше написалъ
Dmitriy
find({$or: [{"name": {$regex: /.*789.*/i}, {"surname": {$regex: /.*789.*/i}, {"patronymic": {$regex: /.*789.*/i}]})
Сергей
Dmitriy
как называется odm в ноде которой вы пользуетесь? пойду за вас почитаю доку)
Dmitriy
ааа, я понял, вы просто скопипастили мой пример, который я на коленке писал без проверки и в котором ошибся со скобками 😔
Dmitriy
ну тогда копипастите верный вариант:
{$or: [{"name": {$regex: /.*789.*/i}}, {"surname": {$regex: /.*789.*/i}}, {"patronymic": {$regex: /.*789.*/i}}]}
😜
Mike
ты замени только /.*789.*/i на свой инпут то
Сергей
Dmitriy
Сергей
yopp
yopp
Шардирование это механизм масштабирования, а не отказоустойчивости.
Отказоустойчивость достигается репликацией.
В вашем случае вы скорее всего хотите сбалансировать реплики составляющие конкретный шард таким образом, чтоб в случае отказа или падения линка данные продолжали быть доступны для чтения
Alexey
yopp
Спасибо
https://docs.mongodb.com/manual/tutorial/sharding-high-availability-writes/
Как пример
Serhii
Ребята, есть коллекция юзеров, у юзера есть favourite locations, по перфомансу лучше будет хранить locations отдельной коллекцией и делать lookup по ним или хранить locations внутри users?
Vova
Stripe
Всем привет!
Stripe
подскажите, как мне вытянуть вакансию у которой совпадает имя или тег(тега может и не быть). Содержимое сущности такое
{
"_id" : ObjectId("5dd3f10f3b95a243013a6649"),
"name" : "ABC Test",
"category" : ObjectId("5dd3efd03b95a243013a6641"),
"subcategory" : null,
"contact" : ObjectId("5dd3ef6a8c4315745f11b2c2"),
"hotVacancy" : true,
"city" : ObjectId("5dd3f0853b95a243013a6645"),
"advantage" : ObjectId("5dd3f0468c4315745f11b2c6"),
"externalLink" : null,
"description" : [
"ABC Test",
"ABC Test",
"ABC Test"
],
"requirements" : [
"ABC Test",
"ABC Test"
],
"skills" : [
"ABC Test"
],
"active" : false,
"slug" : "abc-test-minsk",
"tags" : [
ObjectId("5dd54a3a84c33d1991528c72")
]
}
Dmitriy
подскажите, как мне вытянуть вакансию у которой совпадает имя или тег(тега может и не быть). Содержимое сущности такое
{
"_id" : ObjectId("5dd3f10f3b95a243013a6649"),
"name" : "ABC Test",
"category" : ObjectId("5dd3efd03b95a243013a6641"),
"subcategory" : null,
"contact" : ObjectId("5dd3ef6a8c4315745f11b2c2"),
"hotVacancy" : true,
"city" : ObjectId("5dd3f0853b95a243013a6645"),
"advantage" : ObjectId("5dd3f0468c4315745f11b2c6"),
"externalLink" : null,
"description" : [
"ABC Test",
"ABC Test",
"ABC Test"
],
"requirements" : [
"ABC Test",
"ABC Test"
],
"skills" : [
"ABC Test"
],
"active" : false,
"slug" : "abc-test-minsk",
"tags" : [
ObjectId("5dd54a3a84c33d1991528c72")
]
}
Что-то вроде этого {"name": "some name", "tags": objectid}
Stripe
tags опциональный, он может быть, а может и не...
yopp
Stripe
У меня ODM.
Dmitriy
А ещё проще разрулите формат запроса на стороне приложения. Данные то оно отправляет
yopp
Нет никакой разницы. Добавьте условие
Dmitriy
У меня ODM.
И что это меняет? Вампросто надо сделать условие, если во входных параметрах есть таг, то добавить условие в запрос)
Stripe
Есть вакансия у которой есть теги, так мне нужно фильтр сделать по названию вакансии и названию тега, если они совпадают, то вернуть их. Но сейчас есть косяк в том, что тегов нету, а имя вакансии совпадает и возвращается 0.
Stripe
foreach (self::FILTER_FIELDS as $field) {
$matchField = $field;
if ($this->isPropertyNested($field, $resourceClass)) {
try {
$lookups = $this->addLookupsForNestedProperty(
$field,
$aggregationBuilder,
$resourceClass
);
$matchField = $lookups[0];
} catch (MappingException $e) {
$matchField = $field;
}
}
$regex = new Regex(preg_quote($value), 'iu');
$expressions[] = $aggregationBuilder
->matchExpr()
->field($matchField)
->in([$regex]);
}
$matchStage = $aggregationBuilder->match();
foreach ($expressions as $expression) {
$matchStage->addOr($expression);
}
Nick
немного не понятно, приведите пример такого дока
Nick
сделайте в виде json дока
Anonymous
как мне пройтись по всем значениям поля в коллекции, и если оно не уникальное, то отредактировать его наиболее эффективно (много миллионов записей)
Nick
.....
size:{
h: Number,
w: Number,
uom:String
}
....
Nick
чтото в таком стиле
Nick
а блин, вам tags описать надо?
Nick
tags: [String]
https://mongoosejs.com/docs/schematypes.html#arrays
Anonymous
Anonymous
как мне поможет unique индекс? он кинет ошибку и все
Anonymous
я то не против unique, но не вижу как он мне поможет
Anonymous
вот если можно сделать unique и описать что делать в ситуации когда не unique - вот это да, то что я спрашиваю. есть такое?
Dmitriy
как мне поможет unique индекс? он кинет ошибку и все
он вам кинет ошибку с определенным кодом и индексом на котором произошла ошибка. ваша задача в приложение поймать ошибку с кодом 11000 и распарсить из текста ошибки название индекса (в данном контексте поля), которое надо изменить
Dmitriy
вот вам и решение, которое делается довольно элементарно на уровне приложения
Anonymous
ок, но потом же не смогу продолжить цикл с этго же места
Anonymous
хотя надо попробовать. обернуть в трай кетч чтоб не прерывал цикл
Anonymous
ок, спс
Anonymous
await videos.find().forEach никак асинхронным не сделать?
Anonymous
в цикле forEach не работает await
Dmitriy
тут не подскажу, ноду не знаю. это вам лучше в чате ноды уточнить
Anonymous
это драйвер монги, а не нода
Anonymous
https://docs.mongodb.com/manual/reference/method/cursor.forEach/
Anonymous
это вопрос не о ноде
Anonymous
так-то понятно что JSный forEach не ждет
Anonymous
как мне перебрать асинхронно курсор тогда, ок?
Anonymous
т.е. мне надо ждать завержения функции в курсоре
Anonymous
во тут какой-то ForEachAsync есть https://stackoverflow.com/questions/31947391/mongodb-c-sharp-driver-2-0-and-foreachasync
н оя не могу в доке найти
Dmitriy
1) а зачем вам find в той задаче, которую вы описали?
2) у вас все приложение крутится на монге, т.е. вы не имеете отдельного приложения, которое что-то вставляет в базу?
Vova
Anonymous
Dmitriy
а, я просто не понял как вы мыслью перескачили)
Vova
var ar = _myMongoCollection.Find(filter).ToArrayAsync();
foreach (var item in ar)
{
...
}