代码之家  ›  专栏  ›  技术社区  ›  Getter Jetter

MongoDB(JS),在一个文档属性上执行查询操作(如果可用),否则获取其他属性

  •  0
  • Getter Jetter  · 技术社区  · 6 年前

    所以假设我的“请求”集合中有以下文档:

    {
      pickup: {
        coords: null
      },
      meetup: {
        coords: [ someLng, someLat ]
      }
    },
    {
      pickup: {
        coords: null
      },
      meetup: {
        coords: [ someLng, someLat ]
      }
    },
    {
      pickup: {
        coords: [ someLng, someLat ]
      },
      meetup: {
        coords: [ someLng, someLat ]
      }
    }
    

    其目的是向用户显示一个按从最近到最远位置的距离排序的请求列表。

    如果 pickup.coords meetup.coords .

    $cond 但我有一个错误,我不知道如何准确使用它。

    以下是我认为可行的方法:

    const query = {
      $cond: {
        if: {
         'pickup.coords': { $exists: true }
        },
        then: {
          // use pickup.coords as reference for distance to user
        },
        else: {
          // use meetup.coords as reference for distance to user
        }
      }
    }
    
    const requests = await Request.find( query )
    

    错误: unknown top level operator: $cond

    最后的请求会复杂得多,因为我将用 limit $near 我想有一些索引的操作符。但最好能完成第一步:-)

    任何帮助都将不胜感激!

    0 回复  |  直到 6 年前
        1
  •  0
  •   Alex Blex    6 年前

    修改应用程序以插入支持查询的格式的文档。再添加一个包含要搜索的坐标的字段:

    {
        pickup: {
          coords: null
        },
        meetup: {
          coords: [ someLng, someLat ]
        },
        _search: {
          coords: [ someLng, someLat ]  
        }
      },
      {
        pickup: {
          coords: null
        },
        meetup: {
          coords: [ someLng1, someLat1 ]
        },
        _search: {
            coords: [ someLng1, someLat1 ]
        }
      },
      {
        pickup: {
          coords: [ someLng2, someLat2 ]
        },
        meetup: {
          coords: [ someLng3, someLat3 ]
        },
        _search: {
            coords: [ someLng2, someLat2 ]
        }
      }
    

    此字段的索引:

    db.collection.createIndex( { _search : "2dsphere" } )
    

    搜索此字段:

    db.collection.find(
       {
         _search: {
            $nearSphere: {
               $geometry: {
                  type : "Point",
                  coordinates : [  someLng4, someLat4 ]
               }
            }
         }
       }
    )