Никита
Сейчас сделано так
Nick
вам нужен уникальный индекс по вашему ключу и делать обычные insert вставки, если придет дубль, то он просто выдаст ошибку
Никита
event_id должен быть уникальным. Нужно прописать для него уникальный индекс?
Nick
тут есть один момент, дубли прям полные? или нужно будет еще и както склеивать то что в базе и то что пришло?
Никита
Дубли полные. Нужно оставлять только один документ
Nick
да, тогда достаточно уникального индекса по тем полям, которые вы указываете в фильтре сейчас
Nick
если event_id досточно - то только по нему
Daniyar
привет всем... есть вопрос... надо добавить уникальный циферный id для схемы типа: "Заказ #2627938"... как это можно сделать? с помощью $inc?
Philipp
Ребят, кто знает, Compass стал бесплатным навсегда?
Serge
да, чёт медленный, в ms sql быстрее отдаёт, уже думаю, если не подтюню, то оттуда его что-ли брать для pagination, а всё остальное из монги
Более того, на постраничный вывод информации во всех базах тем медленнее, чем дальше по страницам мы смотрим, потому что skip реально идёт по индексу и считает. Поэтому раньше у нас были архивы новостей по месяцам, а потом появился infinite scroll.
Viktor
Спасибо, поизучаю
T.A
добрый день. можете подсказать пожалуйста. означает ли отключение autoIndex что при добавлении новых документов, отмеченные поля не будут индексироваться?
Daniil
autoIndex это фича mongoose а не самой монги, в этом случае он тупо при запуске приложения будет создавать указанные индексы каждый раз
Daniil
понятно, спасибо. тоже полезный ответ https://stackoverflow.com/a/14346910/8859805
отмеченный ответ там советует оставлять этот флаг включенным, хотя в доке действительно не зря настоятельно рекомендуют выключать его, потому что все операции которые потенциально могут стоить вам очень дорого, лучше делать строго вручную, иначе рано или поздно это просто случится)
Valdis
всем привет. поднял базу на одном сервере с аутентификацией - все ок поднимаю на другом и пытаюсь подключиться - UserNotFound: Could not find user "admin" for db "admin" поднимаю через докер композ ниже в чем может быть проблема? почему на одном инстансе нормально работает, а на другом не пускает (папку data перетирал кучу раз чтобы с нуля ставился лог и пасс, system prune делал https://pastebin.com/7a0CxkeG
T.A
ребят, а никак нельзя отсортировать? https://mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#insertMany
T.A
как можно отсортировать?
T.A
по опциям никак
Nick
так это вставка в базу, зачем ее сортировать?
T.A
так это вставка в базу, зачем ее сортировать?
не саму вставку, а данные которые вернёт метод
Nick
а он чтото возвращает?
Nick
если да то работайте с результатом insertMany().sort()
Dmitry
Всем привет. Переключаю mongo из режима replset в standalone. Удалил всех secondary и арбитров, перезапустил без replSet. Все нормально работает, но мне не нравится warning: 2020-04-29T10:29:49.232+0200 I STORAGE [initandlisten] ** WARNING: mongod started without --replSet yet 1 documents are present in local.system.replset 2020-04-29T10:29:49.232+0200 I STORAGE [initandlisten] ** Restart with --replSet unless you are doing maintenance and no other clients are connected. Кто-нибудь знает как дропнуть local.system.replset, чтобы mongo не ругалась? Ну и в будущем чтобы была возможность проинициализировать заново replicaset (rs.initiate)? Сейчас этого не дает: > db["system.replset"].remove({}) WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on local to execute command { delete: \"system.replset\", ordered: true, lsid: { id: UUID(\"4f008daf-42eb-469a-9ca8-d5ab3bb6203e\") }, $db: \"local\" }" } }) Пробовал сделать свою роль с возможностью делать remove в этой базе (local). Но так тоже нельзя (не дает создать такую роль)
Nick
нет такого метода(
так я не спроста спрашивал аозвращает ли оно чтото, вставка ничего не вощвращает, делайте отдельный запрос
Dmitry
так я не спроста спрашивал аозвращает ли оно чтото, вставка ничего не вощвращает, делайте отдельный запрос
а если бы возвращала, то это было бы очень странно. И что вставка может вернуть? Самое логичное - количество данных, которые вставилось
Dmitry
возвращает данные и инстанс
Returns: A document containing: A boolean acknowledged as true if the operation ran with write concern or false if write concern was disabled An array of _id for each successfully inserted documents Ты хочешь массив _id отсортировать?
Nick
T.A
там нет документов
есть. зачем мне обманывать?
Dmitry
там и остальные ключи идут
db.test.insertMany([{test:1},{test:2}]) { "acknowledged" : true, "insertedIds" : [ ObjectId("5ea96bd9a0916a4f0c6f4edd"), ObjectId("5ea96bd9a0916a4f0c6f4ede") ] } insertedIds сортировать нужно?
Nick
есть. зачем мне обманывать?
давайте ссылку на спеку метода
Dmitry
аа. так у меня же монгус
А в чем отличие? mongos> db.test.insertMany([{test:1},{test:2}]) { "acknowledged" : true, "insertedIds" : [ ObjectId("5ea96c53743ab1635eb56a41"), ObjectId("5ea96c53743ab1635eb56a42") ] } mongos>
Dmitry
аа. так у меня же монгус
а или ты про orm. Ну смотри доку
T.A
давайте ссылку на спеку метода
https://mongoosejs.com/docs/api.html#model_Model.insertMany
Dmitry
https://mongoosejs.com/docs/api.html#model_Model.insertMany
«Promise» resolving to the raw result from the MongoDB driver if options.rawResult was true, or the documents that passed validation, otherwise У тебя options.rawResult чему равен?
Dmitry
https://mongoosejs.com/docs/api.html#model_Model.insertMany
в любом случае, он тебе не может это отсортировать методами mongodb. Он тебе вернет либо от mongodb ответ, который я выше писал. Либо просто список документов, которые сортировать нужно своими силами
Dmitry
Ребят, а вот по этому вопросу: https://t.me/MongoDBRussian/72924 Как я понял это не решить никак?
Nick
https://mongoosejs.com/docs/api.html#model_Model.insertMany
вы почемуто смотрите на вторую част ьфразы, хотя в вашем случае в видете результат первой части
T.A
а почему 0мс?
T.A
а почему 0мс?
это баг или так работает индексация в монге?
Nick
у вас там документов мало, вот и быстро
T.A
у вас там документов мало, вот и быстро
я правильно понял, что спад будет заметен когда размер идексов превысит размер озу?
Dmitry
drop()
нет > use local switched to db local > db["system.replset"].drop() 2020-04-29T14:37:18.186+0200 E QUERY [thread1] Error: drop failed: { "ok" : 0, "errmsg" : "not authorized on local to execute command { drop: \"system.replset\", lsid: { id: UUID(\"f0598b25-9bc5-4aeb-aa99-1f748b948b21\") }, $db: \"local\" }", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DBCollection.prototype.drop@src/mongo/shell/collection.js:695:1 @(shell):1:1 > db.dropDatabase() { "ok" : 0, "errmsg" : "not authorized on local to execute command { dropDatabase: 1.0, lsid: { id: UUID(\"f0598b25-9bc5-4aeb-aa99-1f748b948b21\") }, $db: \"local\" }", "code" : 13, "codeName" : "Unauthorized" }
yopp
проверьте права
Dmitry
not authorized
рута права > db.runCommand({connectionStatus : 1}) { "authInfo" : { "authenticatedUsers" : [ { "user" : "root", "db" : "admin" } ], "authenticatedUserRoles" : [ { "role" : "root", "db" : "admin" } ] }, "ok" : 1 }
yopp
Prior to 3.4, dbAdminAnyDatabase includes local and config databases. To provide dbAdmin privileges on the local database, create a user in the admin database with dbAdmin role in the local database.
yopp
"role" : "root", "db" : "admin <-----
yopp
в монге бардак с правами
yopp
проще отключить аутентификацию, удалить базу, включить аутетнификацию
Dmitry
"role" : "root", "db" : "admin <-----
https://docs.mongodb.com/manual/reference/built-in-roles/#root root содержит в себе dbAdminAnyDatabase Любой пользователь созданный в базе admin, с правами на другие базы, будет иметь доступ к другим базам. Привелигии роли root распространаются на все базы, если она назначена пользователю базы admin. Но с local это не работает в том и проблема Нелзья в базе local создать пользователя с ролью root или dbAdminAnyDatabase, или назначить любому пользователю эти роли для базы local > use local switched to db local > db.createUser({ user: "root", pwd: "pass", roles: [{role: "root", db: "local"}]}) 2020-04-29T14:44:52.839+0200 E QUERY [thread1] Error: couldn't add user: Cannot create users in the local database : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createUser@src/mongo/shell/db.js:1437:15 @(shell):1:1 > db.createUser({ user: "root", pwd: "pass", roles: [{role: "dbAdminAnyDatabase", db: "local"}]}) 2020-04-29T14:45:32.230+0200 E QUERY [thread1] Error: couldn't add user: Cannot create users in the local database : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createUser@src/mongo/shell/db.js:1437:15 @(shell):1:1 Тоже самое и для назначения роли switched to db admin > db.grantRolesToUser('root',[{role:"root",db:"local"}]) 2020-04-29T14:48:21.148+0200 E QUERY [thread1] Error: No role named root@local : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.grantRolesToUser@src/mongo/shell/db.js:1640:19 @(shell):1:1 Там просто нет таких ролей. И создать их нельзя > db.createRole({role:"custom",privileges: [ {resource: {db:"local",collection:"system.replset"}, actions: ["remove"] }], roles: []}) 2020-04-29T14:50:53.341+0200 E QUERY [thread1] Error: Cannot create roles in the local database : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createRole@src/mongo/shell/db.js:1702:1 @(shell):1:
yopp
https://docs.mongodb.com/manual/reference/built-in-roles/#root root содержит в себе dbAdminAnyDatabase Любой пользователь созданный в базе admin, с правами на другие базы, будет иметь доступ к другим базам. Привелигии роли root распространаются на все базы, если она назначена пользователю базы admin. Но с local это не работает в том и проблема Нелзья в базе local создать пользователя с ролью root или dbAdminAnyDatabase, или назначить любому пользователю эти роли для базы local > use local switched to db local > db.createUser({ user: "root", pwd: "pass", roles: [{role: "root", db: "local"}]}) 2020-04-29T14:44:52.839+0200 E QUERY [thread1] Error: couldn't add user: Cannot create users in the local database : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createUser@src/mongo/shell/db.js:1437:15 @(shell):1:1 > db.createUser({ user: "root", pwd: "pass", roles: [{role: "dbAdminAnyDatabase", db: "local"}]}) 2020-04-29T14:45:32.230+0200 E QUERY [thread1] Error: couldn't add user: Cannot create users in the local database : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createUser@src/mongo/shell/db.js:1437:15 @(shell):1:1 Тоже самое и для назначения роли switched to db admin > db.grantRolesToUser('root',[{role:"root",db:"local"}]) 2020-04-29T14:48:21.148+0200 E QUERY [thread1] Error: No role named root@local : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.grantRolesToUser@src/mongo/shell/db.js:1640:19 @(shell):1:1 Там просто нет таких ролей. И создать их нельзя > db.createRole({role:"custom",privileges: [ {resource: {db:"local",collection:"system.replset"}, actions: ["remove"] }], roles: []}) 2020-04-29T14:50:53.341+0200 E QUERY [thread1] Error: Cannot create roles in the local database : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createRole@src/mongo/shell/db.js:1702:1 @(shell):1:
нет
Dmitry
yopp
-> Любой пользователь созданный в базе admin, с правами на другие базы, будет иметь доступ к другим базам. нет
yopp
вам в документации написано чёрным по белому
yopp
вы можете продолжать спорить
yopp
но вам нужно в admin дать root роль на базу local
yopp
потому что dbAdmin _не даёт_ права на local и config
yopp
а так как root это мета-роль, у root по-умолчанию _нет_ прав на администрирование local и config
yopp
как я сказал, проще всего запустить на loopback, выключить аутентификацию, удалить что хотите, запустить на продуктивном порту
yopp
потому что root это не unix root
yopp
есть ряд привилегий которых у root нет по-умолчанию, но он может их себе или другим добавить
Dmitry
вам в документации написано чёрным по белому
Нет ты не прав. Создаем пользвателся в базе admin, с правами на базу test > use admin switched to db admin > db.createUser({ user: "test", pwd: "test", roles: [{role: "readWrite", db: "test"}]}) Successfully added user: { "user" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > Заходим в базу тест, убеждаемся что там пользователся нет: > use test switched to db test > db.getUsers() [ ] Делаем запрос от пользователя test в базу test root@test2:~# mongo --norc -utest -ptest --authenticationDatabase admin --eval 'db.getCollectionNames()' test MongoDB shell version v3.6.18 connecting to: mongodb://127.0.0.1:27017/test?authSource=admin&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("66821ec0-2b47-4bdc-a4b1-143031d15d17") } MongoDB server version: 3.6.18 [ "collection_test", "incr", "incr2", "incr3", "incr4", "t1", "t2", "test" ]
Dmitry
но вам нужно в admin дать root роль на базу local
нет возможности такой. Я выше писал. Могу еще раз написать