- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有两个集合 Members 和 MobileUserLocations - 每个用户位置都保存(可以是多个)作为 userId 作为外部字段。
成员:
{
_id: ObjectId("591553ffa4233a181506880c"),
userName: "Test user"
}
移动用户位置:
{ _id: ObjectId("59156070a4233a1815068b6b"),
userId: ObjectId("591553ffa4233a181506880c"),
location: {type: "Point", coordinates: [76.9121, 10.2232]]},
updatedOn: 2017-05-12T07:12:48.626Z,
status: 1
},
{ _id: ObjectId("59156070a4233a1815068b6b"),
userId: ObjectId("591553ffa4233a181506880c"),
location: {type: "Point", coordinates: [76.8121, 10.1232]]},
updatedOn: 2017-05-12T07:12:48.626Z,
status: 1
}
我想获取半径范围内的成员 - 例如 5 公里引用特定地理点 - 例如:[10.0132295, 76.3630502](lat,lng 格式)。
我试过这个:
collection.aggregate([
{$match: {_id: { $ne: options.accessToken.userId }},
{ "$lookup": {
"localField": "_id",
"from": "MobileUserLocations",
"foreignField": "userId",
"as": "userLocInfo"
}
},
{
$project: {
_id: 1,
userLocInfo: {
"$filter": {
"input": "$userLocInfo",
"as": "userLoc",
"cond": {
"$eq": [ "$$userLoc.status", -1],
"$$userLoc.location": {"$geoWithin": {"$centerSphere": [[76.3630502, 10.0132295], 5 / 3963.2]}}
}
}
}
}
},
{$unwind: "$userLocInfo"}
]
但是没有得到。如果我从过滤器 cond 中删除 $geowithin,它会获取,否则不会获取。但如果我单独查询集合,我会得到结果。
谁能知道这个问题?
最佳答案
那是行不通的,因为 $geoWithin
不是“逻辑运算符”,而是“查询运算符”,只能在使用 $match
的聚合管道中使用.幸运的是,这正是您想要的。虽然你还不明白为什么:
collection.aggregate([
{ "$match": {
"_id": { "$ne": options.accessToken.userId }
}},
{ "$lookup": {
"localField": "_id",
"from": "MobileUserLocations",
"foreignField": "userId",
"as": "userLocInfo"
}},
{ "$unwind": "$userLocInfo" },
{ "$match": {
"userLocInfo.status": -1,
"userLocInfo.updatedOn": "2017-05-12T12:11:04.183Z",
"userLocInfo.location": {
"$geoWithin": {
"$centerSphere": [[76.3630502, 10.0132295], 5 / 3963.2]
}
}
}}
])
除了它是唯一的工作方式之外,还有一个很好的理由。要理解,请查看 "explain"
输出:
{
"$lookup" : {
"from" : "MobileUserLocations",
"as" : "userLocInfo",
"localField" : "_id",
"foreignField" : "userId",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
},
"matching" : {
"$and" : [
{
"status" : {
"$eq" : -1.0
}
},
{
"updatedOn" : {
"$eq" : "2017-05-12T12:11:04.183Z"
}
},
{
"location" : {
"$geoWithin" : {
"$centerSphere" : [
[
76.3630502,
10.0132295
],
0.00126160678239806
]
}
}
}
]
}
}
}
向您展示的是$unwind
和以下 $match
融入 $lookup
舞台本身。这意味着 $geoWithin
和其他条件实际在外部集合上执行 “之前” 结果返回。
这就是$lookup
处理可能违反 16MB 限制的结果连接。这也是目前“过滤”连接结果的最有效方式。
所以这才是您真正想在这里做的事情。
根据您问题中的数据,此声明:
db.members.aggregate([
{ "$lookup": {
"localField": "_id",
"from": "MobileUserLocations",
"foreignField": "userId",
"as": "userLocInfo"
}},
{ "$unwind": "$userLocInfo" },
{ "$match": {
"userLocInfo.location": {
"$geoWithin": {
"$centerSphere": [[76.9121, 10.2232], 5 / 3963.2]
}
}
}}
])
过滤掉 $lookup
中与约束条件匹配的一个位置:
/* 1 */
{
"_id" : ObjectId("591553ffa4233a181506880c"),
"userName" : "Test user",
"userLocInfo" : {
"_id" : ObjectId("59c3c37359f55d64d6e30297"),
"userId" : ObjectId("591553ffa4233a181506880c"),
"location" : {
"type" : "Point",
"coordinates" : [
76.9121,
10.2232
]
},
"updatedOn" : ISODate("2017-05-12T07:12:48.626Z"),
"status" : 1.0
}
}
关于mongodb - 在 $lookup 上使用 Foriegn Collection 的 $geowithin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46341546/
以下文档: { "_id" : ObjectId("56dd4fb755eb122ee622e17d"), "geo_segments" : { "type" : "M
我正在使用 meteor 查询 mongodb 集合。现在这是我的查询,其中 location 是一个 2dsphere 索引。 messages.find({ loc
我有以下查询来查找特定范围内的所有文档: db.collection.find({ "location": { "$geoWithin": { "$bo
每次我尝试从集合中返回一些数据时,它都会返回一个空数组。我正在使用铁路由器,这是我的代码: 客户: Meteor.call('insertEvent', { "eventLoc": {
下面的搜索工作没有问题,但是当我更改为在多边形内寻找位置的搜索类型时,它会丢失,是否必须在搜索中进行一些调整?我做了一些尝试,将在下面发布 db.geom.insert({"polygons":
最初我想支持带有 geo $near 功能的 mongo db 文本搜索。后来意识到这两个不能一起使用,因为都需要索引。 后来我决定改用$geoWithin。但是,结果不像 $near 那样按距离排序
mongoDB 中的$geoWithin 和$geoIntersects 运算符有什么区别? 如果我正在寻找坐标(使用默认坐标引用系统),$geoWithin 和 $geoIntersects 将返回
我有一个 GeoJSON Point 形式的坐标数据集合,我需要从中查询一个区域内的 10 个最新条目。现在有 1.000.000 个条目,但将增加大约 10 倍。 我的问题是,当所需区域内有很多条目
使用 $geoWithin 时出现意外结果, 我有这个: perim = 10 center = [35.964734, 5.03952] 如果我运行: list(db.users.find({"ad
我是 mongodb 地理空间查询的新手,我尝试在具有如下代码的多边形内搜索点: db.properties.find({ location:{ $geoWithin : {
我正在尝试检索存储在我的数据库中的一堆多边形,并按半径对它们进行排序。所以我用一个简单的 $geoWithin 写了一个查询。 所以,没有排序的代码看起来像这样: db.areas.find(
我在我的 Node.js 服务器中编写了以下架构: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var conf
我想查询所有包含一个点的多边形的文档,然后针对该结果集,根据该点与文档位置的接近程度对其进行排序。 想象一下,我有一个 friend 数据库,因为我很酷,想看看哪些 friend 在我的范围内并且愿意
我们已经部署了一个 docker 容器,其中运行着一个 MongoDB 数据库。这是一个简单的数据库,我们在其中存储地理引用传感器数据(例如温度、风速)。由于我们想要查询基于搜索半径的这些地理引用观察
我有一个 mongodb $geoWithin 查询如下 db.test.find( { 'loc': { $geoWithin: {
我在这里试图做的是,我只想要那些在提供的纬度和经度范围内的子文档,但是如果我的文档中只有一个子文档匹配而其他子文档不匹配,它应该只返回包含该特定文档的文档。但它也返回了我所有的子文档,你们可以帮助我吗
从 mongodb 获取此查询: db.location.find( {loc: { $geoWithin: { $centerSphere: [ [ 9, 9], radius ] } },
我有两个集合 Members 和 MobileUserLocations - 每个用户位置都保存(可以是多个)作为 userId 作为外部字段。 成员: { _id: ObjectId("5915
使用 MongoDB 3.2 我正在尝试对点集合使用 2dsphere 查询。 假设我有一个集合 cust_5_abcd,在 the_geom 字段上有一个 2dsphere 索引。 在集合中添加几何
我正在尝试编写一个 MongoDB 查询,用于搜索以指定位置为中心的半径内的文档。 下面的查询有效。它查找在 searching.coordinates 的 searching.radius 弧度内的
我是一名优秀的程序员,十分优秀!