每个人。希望你一切顺利。我目前有这个问题。
这是我的"旅行"模式。
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"
]
}
}
}}
]
}
})
看看它是如何在操场上工作的例子