A
и вот я не могу понять в чем мой прокол
Yurii
Bandikoot
а на остальные он забивает
насколько помню, нужно в match-части также указывать массив, чтобы positional operator в $set блоке по нему работал
Yurii
Yurii
ниже, она не умеет orders.$[].state
Bandikoot
я сталкивался с подобным на 3.4
A
ну а что если монга ниже?)
Yurii
ну а что если монга ниже?)
может @dd_bb что-то подскажет, но я делал выгрузку с базы по критерию, вручную проходился по массиву. менял документ и делал update каждого документа
A
я вот не могу найти как обновиться до 3.6
Max
A
а хотя нет, с монгой все норм, 3.6.2
Тогда яне могу понять почему $[] не работае
Oleg
ребят, как избавиться в шарповом драйвере от записи дискриминатора типа
мы и так четко знаем какой там тип, нет никакого полиморфизма
просто лишнее поле болтается с названием _t
Oleg
все, нашел, спасибо
Anonymous
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, то его нет.
Куда копать? )
Nikita
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, то его нет.
Куда копать? )
а если сделать так:
Location: {
coordinates: {
type: [Number], // [<longitude>, <latitude>]
index: '2dsphere'
}
}
?
Alexander
Alexander
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?
Alexander
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
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
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.
Alexander
yopp
Дорогой чятик, в воскресенье, 3 июня, с 19:00 до 22:00 (Мск) Артём @SvPupok делает тестовый стрим. Будем говорить о репликации и шардировании.
public poll
Да, хочу смотреть – 45
👍👍👍👍👍👍👍 92%
Нет, мне неинтересно – 2
▫️ 4%
Нет, мне неудобно – 2
▫️ 4%
👥 49 people voted so far.
Alexander
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
еще условие