在对象数组中按顺序查找开始和结束-MongoDB



每个人。希望你一切顺利。我目前有这个问题。

这是我的"旅行"模式。

const TravelSchema = new mongoose.Schema({
...
route: [{
index: { type: Number},
lat: { type: Number },
lng: { type: Number },
}],
...
});

这是我处理邮件请求的地方。(保存新行程)

...
const {route, ...rest} = req.body;
const newTravel = new Travel({
route: route.map((location, index) => ({index, ...location})),
...rest
});
const Travel = await newTravel.save();
...

按开始和结束位置顺序搜索。起始位置和结束位置是具有"lat"one_answers"lng"属性的对象。

...
const { start, end } = req.body;
//start -> {lat: 51.11213, lng: 19.1239219} //for example
const travels = await Travel.find({
route: { $all: [ {$elemMatch: {...start}}, {$elemMatch: {...end}} ] },
$expr: {
$lt: [
{$arrayElemAt: ['$route.index', {$indexOfArray: ['$route', {...start}]}]},
{$arrayElemAt: [{$reverseArray: '$route.index'}, {$indexOfArray: [{$reverseArray: '$route'}, {...end}]}]},
]
}
});
console.log(travels); // [] is printed
...

如果没有$expr,我可以得到一些结果,但不能得到准确的结果。我想要的是这样的:

route: [{index: 0, lat: 54, lng: 13},  //same as end but not considered regarding order
{index: 1, lat: 32, lng: 51},
{index: 1, lat: 10, lng: 30},  //start
{index: 2, lat: 54, lng: 13}]  //end
start: {lat: 10, lng: 30}, end: {lat: 54, lng: 13}
the route is filtered
route: [{index: 0, lat: 54, lng: 13},  //end
{index: 1, lat: 32, lng: 51},
{index: 1, lat: 10, lng: 30}]  //start
start: {lat: 10, lng: 30}, end: {lat: 54, lng: 13}
the route is not filtered this time

你能帮我解决这个问题吗?提前谢谢。

如果我理解正确,您可以将$min$max$reduce一起使用。由于$indexOfArray返回第一次出现的索引,因此不应在此处使用它,因为您可能会多次使用相同的索引。使用$reduce可以为起点和终点创建所有相关索引的数组。使用$min$max可以检查是否存在小于终点索引的起点索引:

db.collection.find({
route: {$all: [ {$elemMatch: {...start}}, {$elemMatch: {...end}} ] },
$expr: {$lt: [
{$min: {
$reduce: {
input: "$route",
initialValue: [],
in: {
$cond: [
{$and: [{$eq: ["$$this.lat", start.lat]}, {$eq: ["$$this.lng", start.lng]}]},
{$concatArrays: ["$$value", ["$$this.index"]]},
"$$value"
]
}
}
}},
{$max: {
$reduce: {
input: "$route",
initialValue: [],
in: {
$cond: [
{$and: [{$eq: ["$$this.lat", end.lat]}, {$eq: ["$$this.lng", end.lng]}]},
{$concatArrays: ["$$value", ["$$this.index"]]},
"$$value"
]
}
}
}}
]
}
})

看看它是如何在操场上工作的例子

最新更新