RapidCodeLab
но проблема есть, и когда говорят "нужно", что делать...
Dmitriy
на самом деле бизнес готов принять все что угодно, что не будет нести убытков и будет нести прибыль. в случае с инкрементом тут проблема именно программистов, которые годами привыкали к этому и теперь инерция мешает делать по другому
RapidCodeLab
бизнес так "видит", на него не могу повлиять)
RapidCodeLab
так даже в крупных шопах же)
yopp
бизнес так "видит", на него не могу повлиять)
Значит вам нужно учиться доносить свои аргументы. С «бизнесом» это работает в рублях
yopp
В этой группе я уже устал об этом говорить
RapidCodeLab
Значит вам нужно учиться доносить свои аргументы. С «бизнесом» это работает в рублях
аргумент один, "а вот у них так" , типа это удобно для человека
RapidCodeLab
я лично понимаю, что человеческий id заказа не нужен
Dmitriy
аргумент один, "а вот у них так" , типа это удобно для человека
почему в вашей картине мира удобно для человека решает либо бизнес, либо программист? вы как программист считаете что так удобно? нет, привлеките себе в помощь UX дизайнера, найдите аргументы
RapidCodeLab
Нет, это не удобно для человека
в dns так, приходит смс с номером заказа, на точке показываешь смс и тебе твой заказ отдают, я так понимаю они этот номер руками вводят в комп
Dmitriy
Dmitriy
это уже не относится к теме группы, я думаю)
весь наш холивар к ней не относится ;)
Dmitriy
ничего, я просто констатирую факт
факт просто в том, что программист, который делал решение для dns решил, что лучше инкремент)
RapidCodeLab
я еще раз повторю, я сам против всяких автоинкрементов и id для человека)
RapidCodeLab
но я , да, делаю id для людей) грешен) они выглядят как то так gdgdgh-232
Dmitriy
как еще один минус id-и для людей - это упрощение возможности перебора. а это уже факт влияющий на безопасность системы и соответственно финансовым потерям бизнеса. и вот это уже очень хороший аргумент для всех любителей инкремента от бизнеса. сам регулярно им пользуюсь
RapidCodeLab
но вообще, да
Dmitriy
это не касается id типа DFG-123 , тут перебор не катит
в вашем случае - это усложнение алгоритма, соответственно увеличившаяся стоимость разработки и поддержки. я бы такие аргументы использовал с ходу)))
yopp
Вы похоже видите хорошо
RapidCodeLab
Это ужасный номер
как есть( исправимся. для ПО id родной конечно, objectid
Aleksey
Возможно в пределах одной коллекции в двух разных документах внести изменения гарантированно (убрать элемент в одном документе и добавить в другой; хочу хранить категории и списки товаров в этих категориях, чтоб в самих товарах не возиться с этим тк категории нужны только для красивого вывода) ?
yopp
как есть( исправимся. для ПО id родной конечно, objectid
В зависимости от применения, есть разные проблемы. Есть символы которые выглядят похоже, в том числе цифры. Есть символы которые звучат похоже. Сделать искусственный и удобный для людей идентификатор это очень сложная и дорогая задача
Aleksey
Не очень понимаю кейс с убрать/добавить
Как транзакции. Предполагаю что будут коллекции "категории товаров", в документе будет список ссылок на товары. Если пользователь изменил группу для товара, то из одного документа "категория товаров" надо вырезать этот товар, а в другой вставить. Т.е. получается как транзакции, чтоб не задвоить присутствие в двух и не убрать из обоих при ошибке.
yopp
В этом случае у вас изменения будут атомарны в одном документе
Aleksey
Нет особого смысла хранить товары в категории. Храните id категорий в товаре и выбирайте товары по нему
Понял, спасибо. Уже начал смотреть информацию по транзакциям, https://www.mongodb.com/transactions , это действительно уже доступно для всех или есть ограничения (давно читал что работает при нескольких кластерах или как-то так) ?
Иван
Здравствуйте. Подскажите пожалуйста, возможно ли не зависимо от типа поля проверить длину его в bytes?
Иван
Или проверить на ноль byte тип ObjectId
Dmitriy
вы хотите проверять на уровне бд? на уровне приложения не вижу ни каких проблем, а на уровне бд не понятен кейс
Иван
На уровне бд
Иван
Имею такое ObjectIDs must be exactly 12 bytes long (got 0)
Dmitriy
На уровне бд
ну как вариант вот это использовать: https://docs.mongodb.com/manual/reference/operator/aggregation/strLenBytes
Dmitriy
Имею такое ObjectIDs must be exactly 12 bytes long (got 0)
вы инициируете на клиенте поле _id?
Иван
Пробовал, но это для строки. Вываливается ошибка
Dmitriy
Пробовал, но это для строки. Вываливается ошибка
ну переведите objectid в строку: https://docs.mongodb.com/manual/reference/method/ObjectId.toString/
Dmitriy
Имею такое ObjectIDs must be exactly 12 bytes long (got 0)
вообще если я ничего не путаю - эта ошибка возникает когда вы пытаетесь провести операцию не инициировав поле _id. какой у вас ЯП и как вы инициируете структуру?
Dmitriy
хотя думаю что у вас go
Dmitriy
осталось только со структурой и драйвером определиться
Иван
Это происходит при find. Да, go
Dmitriy
покажите структуру в которую у вас идет декодинг?
Dmitriy
и какой все таки драйвер?
Dmitriy
глобалсайн или офф монго?
Иван
и какой все таки драйвер?
https://github.com/globalsign/mgo
Dmitriy
Ок, покажите структуру и json выбираемой записи (если через любое gui выборку сделатьд
Dmitriy
https://github.com/globalsign/mgo
И ещё добрый совет пока не поздно переходите на офф драйвер, там все сильно лучше)
Иван
iter = db.C("subscriber").Find(bson.M{"_id": bson.M{"$in": masters}}).Iter()
Иван
masters = [] bson.ObjectId
Dmitriy
Хм, а вы понимаете свой запрос?) вы пытаетесь найти все записи которые входят в пустой массив?
Dmitriy
Такой запрос на выходе должен давать пустой резултсет
Иван
Я показал тип
Dmitriy
Я не просил тип) я просил структуру в которую у вас декодируется результат поиска)
Иван
Т.е. в master содержится какой ObjectId, у которого len(ObjectId) = 0 bytes грубо говоря
Dmitriy
Почему он там содержится? Вы хотите сделать поиск по записям у которых нет поля _id?
Иван
Я не просил тип) я просил структуру в которую у вас декодируется результат поиска)
type Subscriber struct { Id bson.ObjectId bson:"_id" Number string Branch int Created time.Time State string Version int Customer_Id bson.ObjectId }
Dmitriy
?
Dmitriy
Т.е. в master содержится какой ObjectId, у которого len(ObjectId) = 0 bytes грубо говоря
В данном случае вы со стороны монго ничего не найдёте, т.к. ошибку вам выдаёт драйвер
Иван
видимо драйвер выдаёт ошибку потому что в masters содержится len(ObjectId) = 0 bytes
Иван
один из
Иван
потому что это массив
Dmitriy
видимо драйвер выдаёт ошибку потому что в masters содержится len(ObjectId) = 0 bytes
Да, потому что masters у вас объявлен как массив обжектид
Dmitriy
А обжектид должен быть 12 байт
Dmitriy
потому что это массив
И что что массив, что вы хотите сделать? Расскажите какую выборку вам надо сделать?
Иван
Мне нужно на стороне бд найти такие записи, где ObjectId = 0 bytes, грубо говоря
Иван
Я уже сделал кое-что
Иван
db.getCollection('customer').find({$or : [ {"master_id" : null}, {"master_id" : NaN}, {"master_id" : { $not: { $type: 7 }}}, {"master_id" : { $gt: [{ "$strLenBytes": "master_id" }, 0]}} ]})
Иван
{"master_id" : { $gt: [{ "$strLenBytes": "master_id" }, 0]}} - но это отработает на строке, а если попадётся тип ObjectId о нужно проверить длину этого поля в byte
Иван
Так много проверок потому что не известно каким типом стало это поле и почему там 0 byte
Dmitriy
Хм, мне кажется вам проще сделать кастомный анмаршалер на структуру и в нем проверку на обжектид. И упасть с паникой если вы попали в условие с принтом документа
Dmitriy
Чем описывать все возможные условия в запросе
Dmitriy
А ещё проще не мучаться и сделать миграцию которая установит новые обжектид для коллекции
Иван
на боевой делать проблематично. А если что-нибудь отвалится
Dmitriy
Дамп с боя на локалке залейте) напрягите девопсов помочь)
Иван
А всё-таки можно в запросе "померить" длину поля?