Nick
Ок, спасибо за совет👍🏿
если у вас нет супер сложных функций обработки и хочется не просто сделать, но и немного углубитсья в монгу, то советую посмотреть как это можно сделать через aggregate . там тоже есть возможность указать результирую коллекцию и будет нужно так же переименовывать коллекции, но это будет эффективнее с точки зрения работы с монгой
Сергей
в update параметр upsert в каком значении по умолчанию стоит?
Nick
в update параметр upsert в каком значении по умолчанию стоит?
https://docs.mongodb.com/manual/reference/method/db.collection.update/
Veaceslav
Ребята дайте плиз руку помошь. Есть вопросы по MongoDB в docker.
Al
Все привет!
Al
Нужна помощь по запросу... а как в aggregation выбрать признак того, что lookup на прошлой стадии вернул хоть что то?
Al
this.aggregate([ { $match: { user: ObjectId(user._id), isRoot: false, deletedAt: null } }, { $lookup: { from: "folders", localField: "_id", foreignField: "linkedTo", as: "sharedFolders" } }, { $unwind: "$sharedFolders" }, { $count: "cntShared" }
yopp
sharedFolders будет не пустым массивом
Al
вот запрос.. ну почти то что нужно делает.. те если в массиве sharedFolders что то есть. То его разворачиваю и получаю count больший 1
Al
а если sharedFolders пустой массив, то я получаю просто пустой массив..
Al
А как бы сделать что бы вернуть просто true / false если массив не пустой и пустой соответственно..
Al
условные выражения?
Al
или хотя бы как если массив пустой возращать cntShared == 0
yopp
отфильтровать документы в которых пустой массив?
yopp
{ $match: { "sharedFolders": { $ne: [] } } }
Al
Вообще есть ли какая то возможность оценить массив, ну или даже просто возвращаемые документы на их количество?
Al
знаю смотрел он вернет то сколько элементов в sharedFolders
Al
мне же нужно. Если в результатах только пустые sharedFolders вернуть false или 0 иначе вернуть true ну или число элементов во всех sharedFolders суммарно
Al
this.aggregate([ { $match: { user: ObjectId(user._id), isRoot: false, deletedAt: null } }, { $lookup: { from: "folders", localField: "_id", foreignField: "linkedTo", as: "sharedFolders" } }, { $unwind: "$sharedFolders" }
Al
вот это явно верно с unwind
Al
тк sharedFolders нужно развернуть...
Al
и теперь имеем не вложенный массив а просто набор документов
Al
и вот нужно если этот набор документов пуст вернуть 0 или false
Al
а если не пуст то вернуть его размер
Al
или просто true
Al
явно нужно { $group: { _id: null, И_КАКОЕ_ТО_ВЫРАЖЕНИЕ} },
Al
скорее всего https://docs.mongodb.com/manual/reference/operator/aggregation/cond/ но как его приткнуть..
Al
this.aggregate([ { $match: { user: ObjectId(user._id), isRoot: false, deletedAt: null } }, { $lookup: { from: "folders", localField: "_id", foreignField: "linkedTo", as: "sharedFolders" } }, { $unwind: "$sharedFolders" }, { $count: "cntShared" }, { $project: { _id: 0, isShared: { $cond: { if: { $gte: ["$cntShared", 0] }, then: true, else: false } } } } Вот так возращает true если есть sharedFolders, но пустой массив если их нет...
Al
а как обработать случай когда нет результов на предыдущей стадии агрегации? что бы в этом случае что то выводилось все равно?
Al
Заработало!
Al
this.aggregate([ { $match: { user: ObjectId(user._id), isRoot: false, deletedAt: null } }, { $lookup: { from: "folders", localField: "_id", foreignField: "linkedTo", as: "sharedFolders" } }, { $unwind: { path: "$sharedFolders", preserveNullAndEmptyArrays: true } }, { $group: { _id: null, sharedFolders: { $push: "$sharedFolders" } } }, { $project: { _id: 0, hasShared: { $gt: [{ $size: "$sharedFolders" }, 0] } } } ]).exec()
Al
Те получилось я все возможные результаты lookup собрал в один массив.. и далее оцениваю его size
Roman
привет ребята! db.getCollection('profiles').count({ 'business': { 'business_phone_number': {$type:2} } }) пытаюсь выбрать записи где есть строки, не null получаю 0 записей, что может быть не так?
倫太郎
делай 'business.business_phone_number' если хочешь внутри обьекта искать
Roman
действительно
Roman
спасибо большое!
Anonymous
Нужен совет - как инкрементировать каунтер при каждом запросе к документу? Думаю вместо функции find использовать что-то вроде findOneAndUpdate, посылать сразу апдейт и получать старый документ. Это подходит под мои нужны, но нормальный ли это вариант, нет ли подводных камней?
Anonymous
А зачем это нужно?
примерно подсчитывать, сколько раз запросили документ.
yopp
примерно подсчитывать, сколько раз запросили документ.
Да, в этом случае «примерно» можно и с findAndUpdate
yopp
Но на мой взгляд, статистку лучше вести отдельно.
Anonymous
Да, в этом случае «примерно» можно и с findAndUpdate
спасибо 👍🏿 такой топорный подход пока более чем достаточен
Bro
{ $match: { "sharedFolders": { $ne: [] } } }
$ne вроде как очень плохой запрос при большом количестве документов
AstraSerg
GET = дай мне GET = записать что-то нужно GET = удалить что-то GET = поменять
А если F5 в браузере нажимать будут? Или поисковые роботы походят по вам? :)
Nick
$ne вроде как очень плохой запрос при большом количестве документов
Вы путаете стадию фильтрации в пайплайне агрегации и фильиром на выборке
Viktor
есть какие-то подводные камни в том, чтобы завести в один реплика сет инстансы разных версий?
Viktor
хотим обновиться с 3.4 до 4.0 таким способом и по железу немного добавить
Viktor
в доке я только вижу, что версию протокола (pv1) поддерживают и 3.4 и 4.0
AstraSerg
обновляете слейвы по одному, переключаете с последнего мастер ни них и обновляете этот последний
Nick
само собой, когда у вас одна единственная стадия фильтрации при find и когда у вас десяток фильтраций в пайплайне типа это разные задачи
yopp
$ne плохо только когда мы надеемся на индекс
yopp
в остальных случаях ничего плохого в нём нет
Nick
$ne плохо только когда мы надеемся на индекс
Вот это объяснение прям в точку
Daniil
$ne плохо только когда мы надеемся на индекс
ребят, откуда вы берете такую инфу? где можно почитать, что хорошо, что плохо? ну кроме очевидных вещей
Федор
The inequality operator $ne is not very selective since it often matches a large portion of the index. As a result, in many cases, a $ne query with an index may perform no better than a $ne query that must scan all documents in a collection.
Федор
https://docs.mongodb.com/manual/reference/operator/query/ne/
Victor
Всем привет. Подскажите плз, есть ли подводные камни чтоб юзать бесплатные 512мб в облаке монги с учетом что места больше не нужно?
Vova
В этой группе уже чуть больше килобайта людей
AstraSerg
Bro
Боты половина
yopp
есть какие-то подводные камни в том, чтобы завести в один реплика сет инстансы разных версий?
никаких. кроме того что в сете могут быть только инстансы с соседними минорными версиями. Т.е. 3.4 в 4.0 кластере не заведутся. Сначала с 3.4 -> 3.6 а потом 3.6 -> 4.0
Nick
*кибилюдей
Nick
человеки ж не биты
Aga
Кибимонги)
Юрий
Здравствуйте, подскажите пожалуйста - есть массив чисел, и документы с массивами чисел. Нужно найти вхождение каждого элемента массива с коллекцией документов. Очень хотелось бы использовать для этого агрегацию что бы потом можно было ещё и считать количество. Для начала если я правильно понимаю мне нужен find для каждого элемента массива и он мне вернёт массивы id (допустим) для каждого запроса. Можно ли вообще как-то поместить это в агрегацию как начальный этап или нужно делать кучу запросов из приложения и там уже разбираться с данными...?
AstraSerg
Дайте пример данных, так не понятно.
Юрий
Есть массив arr = [3764, 3482, 2773, 37417, 28, 29246, 22457,..... ] и документы с такими же массивами array: [7645, 1482, 2773, 37417, 285, 29246, 2457,..... ] array: [3764, 2482, 2773, 3741, 2845, 9246, 242457,..... ] если я делаю обычный find({ array: 3764 }, {array: 0}) получаю _id всех документов где в массиве есть этот элемент - и мне нужно так для каждого элемента arr и потом посчитати одинаковые _id и отсортировать
Bro
получаю _id всех документов где в массиве есть этот элемент - вроде нет
Bro
$matchElem внутри массива
Bro
https://docs.mongodb.com/manual/reference/operator/query/elemMatch/
Bro
тебе нужен $unwind оператор а потом $group