【发布时间】:2020-12-03 01:29:54
【问题描述】:
我有一个收藏用户、餐馆、产品 我想查询用户将在他/她的应用程序中看到附近的餐厅(5 公里)isOpen: true 并显示每个餐厅的产品 isAvailable 和 isApproved = true 和 isArchived: false。
let kmToRadian = function(miles){
var earthRadiusInMiles = 6378
return miles / earthRadiusInMiles
}
var user = dbo.collection('users').findOne({_id: id})
var query = {
"location": {
$geoWithin: {
$centerSphere: [ [22.222, 22.222], 5 / 6378.1] //sample coordinates
}
}
}
db.products.aggregate([
{
$lookup: {
from: "restaurants",
localField: "restaurants",
foreignField: "_id",
as: "restaurant"
}
},
{
$match : {
"restaurant.isOpen": true,
"isApproved": true,
"isAvailable": true,
"isArchived": false
}
},
{
$project: {
"restaurant.isOpen": 1,
"isApproved": 1,
"isAvailable": 1,
"isArchived": 1,
"name": 1
}
}
])
在这里,我得到产品 isAvailable、isApproved :true 和 isArchived false。现在,我想去附近 5 公里的餐厅。
收集用户
id: 1
name: "Robert"
location: Object
type: "Point",
coordinates: Array
0: 11.111 //sample coordinates
1: 11.111 //sample coordinates
id: 2
name: "Jason"
location: Object
type: "Point",
coordinates: Array
0: 22.222 //sample coordinates
1: 22.222 //sample coordinates
收藏餐厅
id: 1
name: "Burger King"
location: Object
type: "Point",
coordinates: Array
0: 11.111 //sample coordinates
1: 11.111 //sample coordinates
isOpen: true
id: 2
name: "McDonald's"
location: Object
type: "Point",
coordinates: Array
0: 22.222 //sample coordinates
1: 22.222 //sample coordinates
isOpen: true
id: 3
name: "Chick-fil-A"
location: Object
type: "Point",
coordinates: Array
0: 22.333 //sample coordinates
1: 22.333 //sample coordinates
isOpen: true
收藏品
id: 1
name: "Breakfast Whopper Jr."
price: "$1.29"
isAvailable: true
isApproved: true
createdAt: Tues Dec 01 2020 09:15:19 GMT+0800
updatedAt: Tues Dec 01 2020 09:15:19 GMT+0800
isArchived: false
shop: ObjectId('1')
id: 2
name: "Big Mac"
price: "$4.35"
isAvailable: true
isApproved: true
createdAt: Tues Dec 01 2020 09:15:19 GMT+0800
updatedAt: Tues Dec 01 2020 09:15:19 GMT+0800
isArchived: false
shop: ObjectId('2')
id: 3
name: "Spicy Chicken Sandwich"
price: "$3.29"
isAvailable: true
isApproved: true
createdAt: Tues Dec 01 2020 09:15:19 GMT+0800
updatedAt: Tues Dec 01 2020 09:15:19 GMT+0800
isArchived: false
restaurant: ObjectId('3')
输出: 如果罗伯特在坐标 [22.222, 22.222]。 Robert 将看到麦当劳和 Chick-fil-A 餐厅,因为 isOpen: true。 显示他们的产品是巨无霸和辣鸡三明治,因为 isAvailable、isApproved: true 和 isArchived: false。
【问题讨论】:
-
@Minsky 嗨,我可以对在这种类型的查询中使用什么提出建议吗?
-
db.products.aggregate([ { $lookup: { from: 'restaurants', localField: 'restaurants', foreignField: '_id', as: 'shop' }, }, { $match: { 'restaurant.isOpen': true } } ])接下来我想得到的是餐厅的可用产品和批准是真的,isArchived 是假的。我做对了吗? @明斯基
标签: mongodb mongodb-query geolocation aggregation-framework