A
и вот я не могу понять в чем мой прокол
Bandikoot
а на остальные он забивает
насколько помню, нужно в match-части также указывать массив, чтобы positional operator в $set блоке по нему работал
Yurii
ниже, она не умеет orders.$[].state
Bandikoot
я сталкивался с подобным на 3.4
Yurii
я сталкивался с подобным на 3.4
https://docs.mongodb.com/manual/reference/operator/update/positional-all/ New in version 3.6.
A
ну а что если монга ниже?)
Yurii
ну а что если монга ниже?)
то надо вручную 😅
Yurii
ну а что если монга ниже?)
может @dd_bb что-то подскажет, но я делал выгрузку с базы по критерию, вручную проходился по массиву. менял документ и делал update каждого документа
A
я вот не могу найти как обновиться до 3.6
A
а хотя нет, с монгой все норм, 3.6.2 Тогда яне могу понять почему $[] не работае
Oleg
ребят, как избавиться в шарповом драйвере от записи дискриминатора типа мы и так четко знаем какой там тип, нет никакого полиморфизма просто лишнее поле болтается с названием _t
Oleg
все, нашел, спасибо
Anonymous
как избавится в шарповом драйвере
Oleg
при его использовании
Anonymous
O_O ничего себе
Anonymous
а если не использовать, наверно и... ничего бы не спрашивалось
Oleg
можно код вообще не писать, тогда проблем не будет
Anonymous
зачем вам монга в C#?
Oleg
потому что у нас полное дотнет окружение, но в наследство досталась монга
Anonymous
и вы полноценно не смогли его мигрировать!
Anonymous
все ясно
Oleg
так чтоб мигрировать надо четко понимать куда и сколько это будет стоить
Oleg
а работать должно вчера
Oleg
потому дружим с монгой
Oleg
я не жалуюсь
Alexander
import mongoose from 'mongoose'; const schema = new mongoose.Schema({ Identification: String, Location: { coordinates: [Number], type: { type: String } }, PostalAddress: { AddressLine: [String], BuildingNumber: String, StreetName: String, TownName: String, CountrySubDivision: [String], Country: String, PostCode: String, }, }); schema.index({ Location: '2dsphere' }); export default mongoose.model('Atm', schema); Добавляю в коллекцию через .findOneAndUpdate(...{usert: true, new: true) Если индекс создаю как Location.coordinates, то все ок, но это не верно. А если индекс просто по Location, то его нет. Куда копать? )
Alexander
а если сделать так: Location: { coordinates: { type: [Number], // [<longitude>, <latitude>] index: '2dsphere' } } ?
да, индекс есть. а как теперь запрос сделать на $near c лимитом на 10 ближайших? чот-т гугл блочит мои запросы )))
Alexander
db.atms.find({ 'Location.coordinates' : { $near: [51.5411, -2.41327], $maxDistance: 0.10 } }) Error: error: { "ok" : 0, "errmsg" : "error processing query: ns=barclays.atmsTree: GEONEAR field=Location.coordinates maxdist=0.1 isNearSphere=0\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query", "code" : 2, "codeName" : "BadValue" }
Nikita
Может не надо указывать .coordinates?
Nick
а что мешает взять дефолтную схему для гео? var UserSchema = new Schema({ location: { 'type': {type: String, enum: "Point", default: "Point"}, coordinates: { type: [Number], default: [0,0]} }, }); UserSchema.index({location: '2dsphere'});
Nick
и вставлять объекты с location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, как это указано в доке монги
Alexander
просто запрос надо было не $near делать, а nearSphere
Alexander
но вопрос, как найти 10 ближайших точек остался актуальным ))
Alexander
limit поможет?
Nikita
ага
Nikita
он же итак их отсортирует вроде
Alexander
точно?
Nikita
У меня с $geoNear запросом выдаёт 20 ближайших
Nick
$near Returns geospatial objects in proximity to a point. Requires a geospatial index. The 2dsphere and 2d indexes support $near. $nearSphere Returns geospatial objects in proximity to a point on a sphere. Requires a geospatial index. The 2dsphere and 2d indexes support $nearSphere. странно что нужно было на nearSphere переходить
Nikita
$geoNear: { near: { type: 'Point', coordinates }, maxDistance: 5000, distanceField: 'distance', spherical: true }
Alexander
Хрень какая-то. В консоли монги всё работает: db.atms.find({ 'Location.coordinates': { $geoNear: { $geometry: { type: "Point", coordinates: [-2.41327,51.5411 ] } } } }).limit(2) В модели монгуса нифига не работает const points = Atm.find({ 'Location.coordinates': { $geoNear: { $geometry: { type: 'Point', coordinates: [-2.41327,51.5411 ]} } } }) .limit(10) .then(results => results); Выдает: Error: Can't use $geoNear with Array.
Alexander
Парни, а можете прояснить значение полей distanceMultiplier и maxDistance? в чем они измеряются? $geoNear: { near: { type: 'Point', coordinates: [ -2.41327, 51.5411 ] }, distanceField: 'dist.distance', // distanceMultiplier: 3959, // maxDistance: 50000 / 3959, // query: { type: 'public' }, num: 10, spherical: true }
yopp
> The measuring units for the maximum distance are determined by the coordinate system in use. For GeoJSON point object, specify the distance in meters, not radians.
yopp
Дорогой чятик, в воскресенье, 3 июня, с 19:00 до 22:00 (Мск) Артём @SvPupok делает тестовый стрим. Будем говорить о репликации и шардировании. public poll Да, хочу смотреть – 45 👍👍👍👍👍👍👍 92% Нет, мне неинтересно – 2 ▫️ 4% Нет, мне неудобно – 2 ▫️ 4% 👥 49 people voted so far.
yopp
Чуть позже закинем ивент на TimePad, оттуда будет рассылка с напоминанием
Alexander
Прямо в телеграм?
yopp
Нет, на почту. Но мы придумаем как тут всех оповестить :)
Maksim
Добрый день. Подскажите пожалуйста, возможно ли в монгу сделать запрос вида. Имеется 2 даты, начальная и конечная, так же некое число. С запросом понятно дело разобрался как по датам начальной и конечной выдернуть данные. Но вот дальше сложнее, Нужно вынуть 2 значения timestamp и clear_timestamp, и посчитать их разницу переведя в секунды, сравнив в числом которе было предоставлено; если оно больше или равно этому числу, то вывести результат, если нет, то не выводить
Maksim
сообразил что-то вроде такого для начала
Maksim
db.tg.aggregate([{ $match: {"timestamp": {"$gte": ISODate("2018-05-31T00:00:004Z"),"$lt": ISODate("2018-06-02T00:00:004Z")}}}, { $project: { _id : 0, r1: {$subtract:["timestamp", 5 * 60 * 1000 ]} }},])
yopp
Если я правильно помню, то простые математические операции над датами дают числовой результат.
yopp
В секундах, в вымысле. Так что вы в правильном направлении двигаетесь
Maksim
образно мне надо исключить данные у которых duration меньше допустим 5 минут
Maksim
но с агрегацией в монге я не силен. побороть пока что не удалось
yopp
Да. Вы выбираете сначала события по какой-то дате, а дальше вам надо сделать даже не project, а addField, добавив поле duration, где вы по вашему алгоритму вычисляете длительность и дальше опять match
Maksim
вышенаписанное. это смесь гугл поиска и попытке разобраться
yopp
Хотя мне кажется что даже обычный query можно сделать
Maksim
ну duration надо посчитать получается
yopp
У вас он как считается? Просто разница между датами двух полей?
Maksim
да
Maksim
"timestamp" : ISODate("2018-05-31T21:45:16.653Z"), "clear_timestamp" : ISODate("2018-05-31T21:48:16.653Z"),
yopp
Ну тогда в условие запроса просто добавьте условие ($fieldA - $fieldB) gte X
Maksim
хм
yopp
До тех пор пока у вас duration будет константой в условии, вы можете обходится условием.
yopp
Если у вас duration будет в документе, надо будет через aggregation framework уже
yopp
Кажется. Возможно я с другим кейсом путаю 🙈
Maksim
find({"timestamp": {"$gte": ISODate("2018-05-31T00:00:004Z"),"$lt": ISODate("2018-06-02T00:00:004Z")}}) достаточно сюда добавить получается ?
Maksim
еще условие