如何查询"Car"集合,该集合为每辆汽车存储一个文档,并检索名称中包含特定关键字的所有汽车.然后,找到每辆车的最新"carinfo"文档,只返回距离给定坐标一定距离(X英里)内的车.

以下是相关集合的架构:

Car Schema:
{
  "_id": "ObjectId",
  "name": "String",
}


CarInfo Schema:
{
  "car": {
    "$ref": "Car"
  },
  "address": {
     "location": {
      "type": "Point",
      "coordinates": [Number]
      }
  },
  "timestamp": "Date",
}

我试过了,但我一直收到: MongoServerError:在此上下文中不允许使用$GeoNear、$NEAR和$NEAR球体

db.cars.aggregate([
    {
      $match: {
        name: { $in: KEYWORDS},
      },
    },
    {
      $lookup: {
        from: 'carinfos',
        localField: '_id',
        foreignField: 'car',
        as: 'carInfo',
        pipeline: [{ $sort: { timestamp: -1 } }, { $limit: 1 }],
      },
    },
    {
      $unwind: '$carInfo',
    },
    {
      $match: {
        'carInfo.address.location': {
          $near: {
            $geometry: {
              type: 'Point',
              coordinates: coordinates,
            },
            $maxDistance: 5 * 1609.34,
          },
        },
      },
    }
  ])

推荐答案

一种 Select 是这样做:

  1. 只匹配上周范围内的carinfos
  2. 获取他们的car个数据
  3. 仅匹配具有相关KEYWORDS的文档
  4. 对于每个相关文件,获取这辆车的最新位置
  5. 只保留最新位置的文档.
  6. 如果需要,您可以格式化响应
db.carinfos.aggregate([
  {$geoNear: {
      near: { type: 'Point', coordinates: coordinates},
      distanceField: 'distance',
      maxDistance: DISTANCE_IN_METERS,
      query: {timestamp: {$gte: timestampBeforeLastWeek}}, // for example
      spherical: true
  }},
  {$lookup: {
      from: 'cars',
      localField: 'car',
      foreignField: '_id',
      as: 'carDetail'
  }},
  {$match: {$expr: {$in: [{$first: '$carDetail.name'}, KEYWORDS]}}},
  {$lookup: {
        from: 'carinfos',
        localField: 'car',
        foreignField: 'car',
        as: 'last_id',
        pipeline: [
          { $project: {_id: 0, timestamp: 1}},
          { $sort: { timestamp: -1 } },
          { $limit: 1 },
        ],
   }},
   {$match: {$expr: {$eq: [{$first: "$last_id.timestamp"}, "$timestamp"]}}},

查看它如何在没有$near步骤的playground example上工作,因为它不受支持

Mongodb相关问答推荐

MongoDB v4.4聚合的$getfield替代方案

在MongoDB中获取所有帖子时如何获取相关用户信息

如何使用mongodb进行离线开发?

MongoDB 在一个聚合中包含多个组

Mongoose 查询以获取内部数组和该内部数组中的特定元素

MongoDB DB参考返回null值

Mongo聚合的具体格式

如何在 MongoDB 中对字段进行自定义排序

DB 中的引用对象在 GraphQL 查询中返回 null

如何在 Spring-Data-MongoDB 中使用 $facet、$addFields 和 $function

MongoDB查询仅返回嵌入文档

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

如何在 MongoDB 集合中查找与给定条件匹配的文档和单个子文档

使用 MongoDB 更新数组字段内的特定键/值

Mongoose 是否真的验证了对象 ID 的存在?

MongoDB 日志(log)文件和 oplog 有何不同?

如何将转储文件夹导入 mongodb 数据库?

如何在 MongoDB 中删除此弃用警告,为什么会这样?

将新值推送到 mongodb 内部数组 - mongodb/php