У меня есть MongoDB, хранящий данные с разных датчиков. Он имеет следующую структуру:Запросить документ и все его вложенные документы, соответствующие условию в mongodb (с использованием пружины)
{
"_id" : 1,
"sensorName" : "Heart Rate",
"samplePeriod" : 1000,
"data" : [
{
"timestamp" : NumberLong("1483537204046"),
"dataPoints" : [ 68 70 ]
},
{
"timestamp" : NumberLong("1483537206046"),
"dataPoints" : [ 68 70 ]
}
]
}
{
"_id" : 2,
"sensorName" : "Ambient Light",
"samplePeriod" : 500,
"data" : [
{
"timestamp" : NumberLong("1483537204058"),
"dataPoints" : [ 56, 54, 54, 54 ]
},
{
"timestamp" : NumberLong("1483537206058"),
"dataPoints" : [ 56, 54, 54, 54 ]
}
]
}
Сейчас, например, мне нужен «пульс» - документ со всеми его полями и теми его «данные» - вложенные документами, соответствующими условий «метку времени между 1483537204000 и 1483537214000».
У меня уже есть ответ о том, как это сделать в оболочке монго в другом вопросе. См. Этот код:
aggregate([{
$match: {
"_id": 1
}
}, {
"$project": {
"_id": 1,
"sensorName": 1,
"samplePeriod": 1,
"data": {
"$filter": {
"input": "$data",
"as": "result",
"cond": {
$and: [{
$gte: ["$$result.timestamp", 1483537204000]
}, {
$lte: ["$$result.timestamp", 1483537214000]
}]
}
}
}
}
}])
Но как это сделать в данных весны java? Кажется, в весенних данных нет ничего, как $ filter. Есть ли обходной путь?
Насколько эффективен фильтр в любом случае? Можете ли вы подумать о более эффективном/практическом способе структурирования такого рода данных в mongodb?
Заранее благодарен!
Если вы планируете сделать это с весны, я настоятельно рекомендую вам использовать Spring-данные который даст вам методы для обработки таких запросов. – cralfaro
Я уже использую данные весны (это было изменено в тексте). Я только борюсь, создавая новую агрегацию. Я могу «совпадение», «проект», но не «фильтр». – Nas3nmann
Взгляните на это сообщение, я думаю, вам нужно http://stackoverflow.com/questions/34751845/spring-boot-data-and-mongodb-filter-subdocument-array-query – cralfaro