AstraSerg
Когда обновляться советуете?
Нолик всегда смущает. Лучше подождать, имхо.
Евгений
Главное убедиться что нет других клиентов, которые могут мимо очереди писать
Ну это подконтрольная штука. Может очередь сообщений сюда прикрутить. Хм....
yopp
4.0.1 уже на подходе https://docs.mongodb.com/manual/release-notes/4.0-changelog
Bro
норм. фичи были $lookup и $facet
Hopf
Привет, кто работал с mgo? подскажите есть ли возможность получить objectid созданного документа при Insert?
Slava
Привет, кто работал с mgo? подскажите есть ли возможность получить objectid созданного документа при Insert?
Привет. такой возможности нет, но можно генерить id на клиенте, что-то вроде bson.NewObjectId()
Slava
а вот кстати в драйвере от монги(компании), id таки будет возвращаться https://github.com/mongodb/mongo-go-driver/blob/f172d2723583a272b0b928134b79f5551e3129f5/mongo/results.go#L22
Slava
Дич! Иногда go поражает своими "особенностями"
почему "дич"? я ничего плохого в генерации id на клиенте не вижу
AstraSerg
почему "дич"? я ничего плохого в генерации id на клиенте не вижу
Особенно, учитывая,что upsert его возвращает ( https://godoc.org/launchpad.net/mgo/v2#Collection.Upsert ) А дич, потому что на мой взгляд логично, что БД возвращает итог операции. Для инсерта критические данные - это id, поэтому и сказал. Но возможно ошибаюсь...
Sergey
почему "дич"? я ничего плохого в генерации id на клиенте не вижу
Если _id генерируется на клиенте, то клиент несёт ответственность за его уникальность. И это имеет значение в шардированных кластерах, если _id не является ключом шардирования.
Sergey
В шардированной не по _id коллекции можно запросто получить несколько документов с одинаковым _id в разных шардах.
Constantin
Как бы вам это не казалось дичью но в целях производительности монга работает по принципу выстрелил в нее и забыл
Constantin
Это накладывает требование генерации _id на стороне клиента, а не монги. Собственно клиентом является драйвер, и генерирует _id по-сути он
Constantin
Это накладывает требование генерации _id на стороне клиента, а не монги. Собственно клиентом является драйвер, и генерирует _id по-сути он
Немного ошибся, монга просит, чтобы _id генерился клиентом, если его нет сгенерирует его сама
Constantin
Вот из документации «MongoDB clients should add an _id field with a unique ObjectId» ObjectIds are small, likely unique, fast to generate, and ordered. ObjectId values consist of 12 bytes, where the first four bytes are a timestamp that reflect the ObjectId’s creation. Specifically: a 4-byte value representing the seconds since the Unix epoch, a 3-byte machine identifier, a 2-byte process id, and a 3-byte counter, starting with a random value.
yopp
Если _id генерируется на клиенте, то клиент несёт ответственность за его уникальность. И это имеет значение в шардированных кластерах, если _id не является ключом шардирования.
Никакой разницы в механизме генерации ObjectId нет. Никаких дополнительных проверок не производится. Вероятность коллизий в обоих случаях будет одинаковой.
Rustam
Монга гарантирует порядок id. На клиенте, если у вас распределенная система - этого не добиться. Так что, про генерацию на клиенте - глупость.
yopp
Монга гарантирует порядок id. На клиенте, если у вас распределенная система - этого не добиться. Так что, про генерацию на клиенте - глупость.
Вы ошибаетесь. Монга гарантирует уникальность _id, исключительно потому по этому полю всегда создаётся уникальный индекс. Уникальность индекса никак не зависит от способа его генерации. Всё что делает монга, проверяет наличие атрибута _id и при его отсутствии генерирует ObjectId https://github.com/mongodb/mongo/blob/d337da259248c785f4014b565742300eb08ecd4f/src/mongo/db/ops/insert.cpp#L161
Andrew
Всем привет! Была монга в stand alone, врубил репликацию и добавил инстанс rs.add(). Прикол в чем, на мастере и на слэйве одна и та же коллекция, в которую ничего нового не записывается, имеет разное число документов, если верить db.collName.count()
Andrew
Это вообще законно?
Roman
подскажите кто работает с монгой на уии2 есть задача нужно выбрать из коллекции записи с максимальной датой сгруппированых по ид парента и потом отсеять записи с ненужным статусом делаю вот так $data = $collection->aggregate([ [ '$match' => ['user_id' => $owner], ], [ '$group' => [ '_id' => ['dialogue_id' => '$dialogue_id'], 'max' => ['$max' => '$created_at'] ], ], ]); получаю [ { "_id": { "dialogue_id": { "$oid": "5b5ff2c86784e9000772901a" } }, "max": { "$date": { "$numberLong": "1533041728000" } } }, ... }] собствено вопрос: как откинуть данные с ненужным статусом и как получить данные коллекции а не непонятно че)))??
Николай
Всем привет. Подскажите пожалуйста как можно получить колличество документов в коллекции.
Bro
db.collName.count()
Roman
как после группировки вывести дополнительное поле?
Николай
db.collName.count()
Спасибо.
AstraSerg
@ya_kostya ...монга просит, чтобы _id генерился клиентом, если его нет сгенерирует его сама Ну это меняет дело, тогда это не баг, а фича :) Да вот только, если БД сгенерила id сама, то почему бы его и не отдать в результате операции?
AstraSerg
как после группировки вывести дополнительное поле?
Если речь про агрегацию, то можно использовать стейдж project https://docs.mongodb.com/manual/reference/operator/aggregation/project/
Roman
да но после группировки то что в проджекте игнорируется
Roman
т.е. например я выбрал данные по определенному пользователю. говорю дай мне поле ид_диалога, статус, и время. после чего делаю группировку ипо ид диалога и по максимальному времени
Roman
и у меня на выходе 2 поля всего
AstraSerg
да но после группировки то что в проджекте игнорируется
я имею ввиду добавьте ещё один стейдж после группировки
Roman
после группировки мне нужно было бы отфильтровать еще и по статусу! но посколько этого поля нет в выдачи я получаю пустой массив
AstraSerg
еще раз project?
да, он может повторяться
Roman
jy hf,jnftn njkmrj c ntvb gjkzvb rjnjhst dthyekf uheggbhjdrf
Roman
он работает с теми полями которые вернула группировка
AstraSerg
он работает с теми полями которые вернула группировка
да, через группировку это поле нужно "протащить"
Roman
но тогда будут лишние записи
Roman
да, через группировку это поле нужно "протащить"
или как можно указать поле чтобы по нему не группировало
AstraSerg
но тогда будут лишние записи
Лишние не берите, только те, которые вам нужны. Вот здесь подобную проблему решают https://stackoverflow.com/a/35177196/2733113
Roman
"parentId": { "$first": "$parentId"}
Roman
во возможно это то что мне нужно
Roman
спасибо большое
Roman
пойду пробовать
AstraSerg
во возможно это то что мне нужно
да не за что :) только я б проверил сначала $push-ем какие именно поля вы отбрасываете, уместно ли применение $first
Roman
хорошо спасибо! щас почитаю что такое пуш) после sql както тяжковато для понимания)
Sergey
Никакой разницы в механизме генерации ObjectId нет. Никаких дополнительных проверок не производится. Вероятность коллизий в обоих случаях будет одинаковой.
В теории, да, никакой разницы. Однако на практике, есть несколько "но". Во-первых, каждый драйвер может, в силу багов или ограниченности сознания разработчика, иметь своё видение уникальных ObjectId. Во-вторых, любой разработчик может сам формировать ObjectId для своих документов, минуя монгу и драйвер. Это про ответственность клиента за уникальность. В-третьих, кластер монги имеет больше технических возможностей из коробки, чтобы засинхронизировать machineId в ObjectId, реально гарантировав уникальность ObjectId в кластере. Никаких механизмов сейчас на стороне сервера нет. Есть некоторое подобие, _checkOIDs в балансере, но он может помочь только с теми ObjectId, которые генерируются на mongod, а не на mongos. Есть обещание уникальности в спеке: https://docs.mongodb.com/manual/reference/glossary/#term-id. С одинаковой вероятностью коллизий не соглашусь. Вероятность коллизий возрастает с ростом количества процессов, генерирующих _id. В больших кластерах процессов mongod и mongos обычно поменьше, чем клиентских процессов.
Rustam
Вы ошибаетесь. Монга гарантирует уникальность _id, исключительно потому по этому полю всегда создаётся уникальный индекс. Уникальность индекса никак не зависит от способа его генерации. Всё что делает монга, проверяет наличие атрибута _id и при его отсутствии генерирует ObjectId https://github.com/mongodb/mongo/blob/d337da259248c785f4014b565742300eb08ecd4f/src/mongo/db/ops/insert.cpp#L161
Допишу еще к предыдущему оратору. Тут вот же еще какое дело. Если генерить на стороне клиента, то timestamp в ObjectId завернется клиентский. На разных тачках время может отличаться на несколько секунд. Можно начать записывать новые документы в прошлое. И это не редкий кейс, когда нужно гарантировать порядок id-шек. Разумеется, для этих целей можно использовать дополнительные поля с серверным (монго) timestamp. Но если порядок не важен и вообще пофигу какой тип у id, то тогда можно использовать какой-нибудь UUID и без проблем генерить на клиенте. Поправьте меня, если я ошибаюсь - в монге нет кластерных индексов, поэтому UUID с эффективным распределение порядка не нужен.
Artem
Всем привет. Коллеги случайно сделали db.orders.deleteMany({}), а бэкапов конечно же нет. Есть ли какая возможность восстановить данные?
AstraSerg
хорошо спасибо! щас почитаю что такое пуш) после sql както тяжковато для понимания)
в пуше ничего сложного: он берёт все значения определённого поля из группы и делает из них список, который и возвращает. То есть предположим вы группируете по полю product. У вас получилось 3 продукта по 10 строк в каждом. Ещё вам нужно понять, какие страны у этих продуктов. Тогда делаете пуш и получаете список из стран каждого из 3 продуктов. Надеюсь, понятно :)
AstraSerg
ага я уже прочитал, спс)) вот только у меня была проблема с фестом но я сделал сортировку выше группировки и вроде как в фест начили попадать нужные данные! спасибо что подсказали за пуш
Да не за что. first - это странная штука. Если значения разные, он только введёт в заблуждения, если одинаковые - смысла в нём нет. Разве что сценарий "отсортировать о взять первый элемент"
Roman
ну вот мне нужны были данные по которым нужно было фильтрануть еще раз после группировки. ну и какбы эти данные нужны были! а взять первый или последний не понятно насколько актуально и нужно сортировать
Roman
в самой группировки сортировки я не нашел. поэтому сортирнул до
Roman
надеюсь это корректно будет
AstraSerg
ну вот мне нужны были данные по которым нужно было фильтрануть еще раз после группировки. ну и какбы эти данные нужны были! а взять первый или последний не понятно насколько актуально и нужно сортировать
вроде бы да. В любом случае, использовать группировки, сортировки и т.п. в любом порядке и количестве - это нормально. Ещё посоветовал бы вам почитать про unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/ Он часто нужен в задачах, подобных вашей.
Roman
я читал но не оч понял что он делает))
Andrew
Условно говоря превращает один документ с массивом в несколько документов равных количеству элементов в массиве
AstraSerg
я читал но не оч понял что он делает))
тут опять же всё просто: из одного документа со списком делает несколько документов с каждым из элементов списка. Другие поля при этом повторяются
Andrew
Типа каждый с каждым элементом массива
Andrew
Точно :)
Roman
а ну у меня там списков вроде небыло)
Roman
полычается если поле массив то он преобразует его в отдельные множества?
Roman
вообщем это нужно пробывать чтобы понять))
AstraSerg
а ну у меня там списков вроде небыло)
Список создастся пушем. Не в отдельные множества, а в отдельные элементы.
Roman
а ну да
Roman
впринципе понятно
AstraSerg
полычается если поле массив то он преобразует его в отдельные множества?
вот тут пример наглядный https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#examples
Roman
вот тут вроде норм расписано https://habr.com/post/139643/
AstraSerg
впринципе понятно
Ну и отлично!
Roman
Roman
спасибо вам большое)