Anonymous
Nick
Ок, спасибо за совет👍🏿
если у вас нет супер сложных функций обработки и хочется не просто сделать, но и немного углубитсья в монгу, то советую посмотреть как это можно сделать через aggregate . там тоже есть возможность указать результирую коллекцию и будет нужно так же переименовывать коллекции, но это будет эффективнее с точки зрения работы с монгой
Сергей
в update параметр upsert в каком значении по умолчанию стоит?
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
yopp
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
Anonymous
Нужен совет - как инкрементировать каунтер при каждом запросе к документу? Думаю вместо функции find использовать что-то вроде findOneAndUpdate, посылать сразу апдейт и получать старый документ. Это подходит под мои нужны, но нормальный ли это вариант, нет ли подводных камней?
yopp
yopp
Но на мой взгляд, статистку лучше вести отдельно.
AstraSerg
Viktor
есть какие-то подводные камни в том, чтобы завести в один реплика сет инстансы разных версий?
Viktor
хотим обновиться с 3.4 до 4.0 таким способом и по железу немного добавить
Viktor
в доке я только вижу, что версию протокола (pv1) поддерживают и 3.4 и 4.0
AstraSerg
AstraSerg
обновляете слейвы по одному, переключаете с последнего мастер ни них и обновляете этот последний
Bro
Nick
само собой, когда у вас одна единственная стадия фильтрации при find и когда у вас десяток фильтраций в пайплайне типа это разные задачи
yopp
$ne плохо только когда мы надеемся на индекс
yopp
в остальных случаях ничего плохого в нём нет
Nick
Федор
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
Боты половина
Yura
yopp
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