yopp
4.0.1 уже на подходе https://docs.mongodb.com/manual/release-notes/4.0-changelog
AstraSerg
Bro
норм. фичи были $lookup и $facet
Hopf
Привет, кто работал с mgo? подскажите есть ли возможность получить objectid созданного документа при Insert?
AstraSerg
Slava
Hopf
Slava
а вот кстати в драйвере от монги(компании), id таки будет возвращаться
https://github.com/mongodb/mongo-go-driver/blob/f172d2723583a272b0b928134b79f5551e3129f5/mongo/results.go#L22
AstraSerg
Sergey
В шардированной не по _id коллекции можно запросто получить несколько документов с одинаковым _id в разных шардах.
Constantin
Constantin
Как бы вам это не казалось дичью но в целях производительности монга работает по принципу выстрелил в нее и забыл
Constantin
Это накладывает требование генерации _id на стороне клиента, а не монги. Собственно клиентом является драйвер, и генерирует _id по-сути он
Constantin
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
Rustam
Монга гарантирует порядок id. На клиенте, если у вас распределенная система - этого не добиться. Так что, про генерацию на клиенте - глупость.
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
как после группировки вывести дополнительное поле?
Николай
AstraSerg
@ya_kostya ...монга просит, чтобы _id генерился клиентом, если его нет сгенерирует его сама Ну это меняет дело, тогда это не баг, а фича :) Да вот только, если БД сгенерила id сама, то почему бы его и не отдать в результате операции?
Roman
да но после группировки то что в проджекте игнорируется
AstraSerg
Roman
т.е. например я выбрал данные по определенному пользователю. говорю дай мне поле ид_диалога, статус, и время. после чего делаю группировку ипо ид диалога и по максимальному времени
Roman
и у меня на выходе 2 поля всего
Roman
после группировки мне нужно было бы отфильтровать еще и по статусу! но посколько этого поля нет в выдачи я получаю пустой массив
Roman
Roman
jy hf,jnftn njkmrj c ntvb gjkzvb rjnjhst dthyekf uheggbhjdrf
Roman
он работает с теми полями которые вернула группировка
Roman
но тогда будут лишние записи
Roman
AstraSerg
но тогда будут лишние записи
Лишние не берите, только те, которые вам нужны. Вот здесь подобную проблему решают https://stackoverflow.com/a/35177196/2733113
Roman
"parentId": { "$first": "$parentId"}
Roman
во возможно это то что мне нужно
Roman
спасибо большое
Roman
пойду пробовать
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 обычно поменьше, чем клиентских процессов.
Artem
Всем привет. Коллеги случайно сделали db.orders.deleteMany({}), а бэкапов конечно же нет. Есть ли какая возможность восстановить данные?
Gleb
AstraSerg
хорошо спасибо! щас почитаю что такое пуш) после sql както тяжковато для понимания)
в пуше ничего сложного: он берёт все значения определённого поля из группы и делает из них список, который и возвращает. То есть предположим вы группируете по полю product. У вас получилось 3 продукта по 10 строк в каждом. Ещё вам нужно понять, какие страны у этих продуктов. Тогда делаете пуш и получаете список из стран каждого из 3 продуктов. Надеюсь, понятно :)
Roman
Roman
ну вот мне нужны были данные по которым нужно было фильтрануть еще раз после группировки. ну и какбы эти данные нужны были! а взять первый или последний не понятно насколько актуально и нужно сортировать
Roman
в самой группировки сортировки я не нашел. поэтому сортирнул до
Roman
надеюсь это корректно будет
Roman
я читал но не оч понял что он делает))
Andrew
Условно говоря превращает один документ с массивом в несколько документов равных количеству элементов в массиве
AstraSerg
я читал но не оч понял что он делает))
тут опять же всё просто: из одного документа со списком делает несколько документов с каждым из элементов списка. Другие поля при этом повторяются
Andrew
Типа каждый с каждым элементом массива
Andrew
Точно :)
Roman
а ну у меня там списков вроде небыло)
Roman
полычается если поле массив то он преобразует его в отдельные множества?
Roman
вообщем это нужно пробывать чтобы понять))
Roman
а ну да
Roman
впринципе понятно
Roman
вот тут вроде норм расписано https://habr.com/post/139643/
AstraSerg
Roman
Roman
спасибо вам большое)
AstraSerg