mongodb -使用geoNear而不忽略非二维球体索引行

6ojccjat  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(106)

使用geoNear时,将忽略所有没有位置(不是2dsphere索引的一部分)的行。
如何使用geoNear获取最接近的结果,同时显示没有位置的其他行?没有位置的行在结果中的排名应较低。

.collection('users')
.aggregate([
  {             
    $geoNear: {
       near: { type: "Point", coordinates: [userLocArray[0], userLocArray[1]]},
       distanceField: "dist.calculated",
       spherical: true,
       //maxDistance: matchDistance,
    }
  },

示例文档(在下面的示例中,用户xyzmmmgeoNear省略,因为他们没有位置字段。我只是希望他们排名最低,但不完全省略。

db={
      users: [
        {
          _id: "abc",
          name: "abc",
          group: 1,
          location: {
            type: "Point",
            coordinates: [
              53.23,
              67.12
            ]
          },
          calculatedDist: 112
        },
        {
          _id: "xyz",
          name: "xyyy",
          group: 1,
          calculatedDist: 13
        },
        {
          _id: "123",
          name: "yyy",
          group: 1,
          location: {
            type: "Point",
            coordinates: [
              54.23,
              67.12
            ]
          },
          calculatedDist: 13
        },
        {
          _id: "rrr",
          name: "tttt",
          group: 1,
          location: {
            type: "Point",
            coordinates: [
              51.23,
              64.12
            ]
          },
          calculatedDist: 14
        },
        {
          _id: "mmm",
          name: "mmmm",
          group: 1,
          calculatedDist: 14
        },

      ]
    }
mzsu5hc0

mzsu5hc01#

您只需在管道末尾添加另一个$match阶段,即可选择那些没有位置的文档

db.users.aggregate([
  {
    "$geoNear": {
      "near": {
        "type": "Point",
        "coordinates": [
          53.23,
          67.12
        ]
      },
      "distanceField": "d"
    }
  },
  {
    "$unionWith": {
      "coll": "users",
      "pipeline": [
        {
          "$match": {
            "location": null
          }
        }
      ]
    }
  }
])

是的,你是对的,Mongo Playground不能演示2d球指数行为。但我还是在这里放了it

相关问题