MongoDB(JS),对一个文档属性(如果有)进行查询操作,否则获取其他属性

时间:2019-04-11 10:23:48

标签: javascript database mongodb mongoose

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

{
  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运算符进行一些索引。但是,最好完成第一步:-)

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

{
    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 ]
           }
        }
     }
   }
)