yopp
и это исключительно о порядке выполнения запросов из бачта
yopp
bulkwrite это предварительная оптимизация
Anton
А как можно реализовать «естественную сортировку», чтобы было
item 20
item 100
а не
item 100
item 20
?
Serhii
Просто мне в некоторых кейсах нужно создать такие айтемы, а в некоторых обновить, можно ли заюзать updateMany с флагом upsert: true?
Serhii
@a_sozonov key: -1 вроде
Nick
Serhii
@yatoba понял
Serhii
@yatoba а что бы перезаписывать?
Nick
фактически там параметр multy: true
Serhii
@yatoba insertMany?
Nick
оно перезапишет, но нужно на каждый док делать свое
Nick
updateOne с upsert:true
yopp
я ешё раз повторю: не надо оптимизировать то, что не надо оптимизировать
Serhii
понял, спасибо ребзи
Nick
Nick
надо бы тогда уточнить
Anton
да, есть поле name, в нем имена вида
item 20, item 1000
надо чтоб при сортировке база «понимала», что это число и что 1000 > 20, поэтому item 20 должен стоять перед item 1000
Anton
если сделать {$sort: {name: 1}}, то будет тупо по алфавиту
Nick
это проблема всех строковых сравнений, выносите номер в отдельное поле и сортируйте по нему
Nick
либо на стороне клиента сортируйте как вам угодно
yopp
Nick
чет не работает
Nick
{
"v" : 2,
"key" : {
"v" : 1.0
},
"name" : "v_1",
"ns" : "fds.tstt",
"collation" : {
"locale" : "en",
"caseLevel" : false,
"caseFirst" : "off",
"strength" : 3,
"numericOrdering" : true,
"alternate" : "non-ignorable",
"maxVariable" : "punct",
"normalization" : false,
"backwards" : false,
"version" : "57.1"
}
}
db.getCollection('tstt').find({}).sort({v:1})
/* 1 */
{
"_id" : ObjectId("5ca4a341c819f2a497463d60"),
"v" : "item 10"
}
/* 2 */
{
"_id" : ObjectId("5ca4a34fc819f2a497463d66"),
"v" : "item 1000"
}
/* 3 */
{
"_id" : ObjectId("5ca4a349c819f2a497463d63"),
"v" : "item 20"
}
Anton
yopp
{
"v" : 2,
"key" : {
"v" : 1.0
},
"name" : "v_1",
"ns" : "fds.tstt",
"collation" : {
"locale" : "en",
"caseLevel" : false,
"caseFirst" : "off",
"strength" : 3,
"numericOrdering" : true,
"alternate" : "non-ignorable",
"maxVariable" : "punct",
"normalization" : false,
"backwards" : false,
"version" : "57.1"
}
}
db.getCollection('tstt').find({}).sort({v:1})
/* 1 */
{
"_id" : ObjectId("5ca4a341c819f2a497463d60"),
"v" : "item 10"
}
/* 2 */
{
"_id" : ObjectId("5ca4a34fc819f2a497463d66"),
"v" : "item 1000"
}
/* 3 */
{
"_id" : ObjectId("5ca4a349c819f2a497463d63"),
"v" : "item 20"
}
а «100» и «200»?
Nick
чисто числовые сортируются
Nick
/* 4 */
{
"_id" : ObjectId("5ca4a462c819f2a497463dc9"),
"v" : "200"
}
/* 5 */
{
"_id" : ObjectId("5ca4a45ac819f2a497463dc7"),
"v" : "100"
}
/* 6 */
{
"_id" : ObjectId("5ca4a469c819f2a497463dcd"),
"v" : "10"
}
yopp
welp
Nick
ща еще 1000 запихну
Nick
кек
Nick
/* 4 */
{
"_id" : ObjectId("5ca4a462c819f2a497463dc9"),
"v" : "200"
}
/* 5 */
{
"_id" : ObjectId("5ca4a4aec819f2a497463de5"),
"v" : "1000"
}
/* 6 */
{
"_id" : ObjectId("5ca4a45ac819f2a497463dc7"),
"v" : "100"
}
/* 7 */
{
"_id" : ObjectId("5ca4a469c819f2a497463dcd"),
"v" : "10"
}
Nick
не работает
Nick
.sort({v:-1})
Nick
ну да оно индекс не юзает
Nick
момент
yopp
момент
а ты collation(locale: «en») указываешь?
Nick
да
Nick
я выше скинул как индекс определен
yopp
в запросе
Nick
эм
Nick
понял, ща
yopp
To use an index for string comparisons, an operation must also specify the same collation. That is, an index with a collation cannot support an operation that performs string comparisons on the indexed fields if the operation specifies a different collation.
yopp
https://docs.mongodb.com/manual/reference/collation/#collation-and-index-use
Nick
Nick
4.0.3
Nick
а робомонго 1.0 вообще не умеет в коллашн, ругается
Anton
в collation же надо прокинуть еще numericOrdering: true
Nick
тогда работает
Nick
Anton
ого
Anton
а у меня не получилось. Но я без индекса делал
yopp
без индекса это не работает
Nick
почемуто работает
Nick
закешилсоь может
yopp
лол, да, работает
yopp
db.str.find({}).collation({locale: "fr", numericOrdering: true}).sort({name: 1})
{ "_id" : ObjectId("5ca4a6355f75e79ede2ee9b1"), "name" : "1" }
{ "_id" : ObjectId("5ca4a6335f75e79ede2ee9b0"), "name" : "13" }
{ "_id" : ObjectId("5ca4a6375f75e79ede2ee9b2"), "name" : "100" }
{ "_id" : ObjectId("5ca4a62c5f75e79ede2ee9ad"), "name" : "name 1" }
{ "_id" : ObjectId("5ca4a6305f75e79ede2ee9af"), "name" : "name 13" }
{ "_id" : ObjectId("5ca4a62e5f75e79ede2ee9ae"), "name" : "name 100" }
yopp
а, ну всё нормально
yopp
Specifies the collation to use for the operation.
Collation allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks.
The collation option has the following syntax:
yopp
You can specify collation for a collection or a view, an index, or specific operations that support collation.
Nick
индекс лишь для ускорения
yopp
йеп
yopp
коллейшены очень странные
Anton
спасибо!
Dmitryi
Привет. Насетапил Sharded кластер все работает но вот есть вопрос как быть с mongos. Вычитал что лучше их не прятать за балансером, а просто сетапить каждый отдельно на своей ноде и в mongo uri прописывать все 3 mongos. Но тут появился вопрос могу ли я использовать srv записи для mongos ?
Ilya
Коллеги, хочу конвертнуть single-инстанс в replicaSet из двух инстансов на одном dev-сервере для бекапа:
* 127.0.0.1:27017 — существующая БД 110GB данных;
* 127.0.0.1:27018 — новый инстанс с чистой БД.
В конфиге каждого указан параметр:
replication:
replSetName: rs0
Захожу на PRIMARY, делаю rs.initiate(), затем rs.add( { host: "127.0.0.1:27018" } ). rs.status() показывает:
"members" : [
{
"name" : "127.0.0.1:27017",
"stateStr" : "PRIMARY",
}, {
"name" : "127.0.0.1:27018",
"stateStr" : "STARTUP2",
}
],
Через пару минут STARTUP2-нода падает в (not reachable/healthy). du -sh говорит, что реплика содержит 3.5G, то есть что-то скопироваться успело. Ошибок нет (или я их не вижу).
Есть какие-то очевидные косяки? С ARBITER-инстансом в пулле такая же история. Спасибо.
Ринат
реплика должна писать в лог хоть что-то при старте и при падении.
мб папку создать не может, прав нет или прав лог писать нету.
yopp
yopp
в srv можно и монгосы положить, да
Ilya
PRIMARY при этом по-прежнему в нормальном состоянии.
Ilya
Права на папку с DB, конфиги, логи — все ОК. Ну то есть сам по себе инстанс живой.
Ринат
тогда очень странно, мб её OOM убивает? в dmesg что?
Ринат
подскажите плиз, есть зависший курсор. Я могу по нему инфу получить? explain() например
получилось по нему сделать getMore таким образом,
var cur = db.getSiblingDB('test').runCommand({ getMore : NumberLong("334757385158"), collection : "users", batchSize: 1})
но cur в итоге не объект типа курсор, и cur.explain() не получается.
yopp
Dmitryi
yopp
mongos и есть роутер, он-же играет роль балансировщика
Dmitryi