簡體   English   中英

在對象數組中按順序查找開始和結束 - MongoDB

[英]Find start and end in order in an array of objects - 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”和“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返回第一次出現的索引,因此不應在此處使用它,因為您可能多次使用相同的 corrdinated。 使用$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"
              ]
            }
          }
      }}
    ]
  }
})

playground 示例中查看它是如何工作的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM