我有一个这样的文档结构:
{
name: "John",
addresses: [
{
city: "London",
location: {
type: "Point",
coordinates: [0, 0]
}
},
{
city: "New York",
location: {
type: "Point",
coordinates: [-74, 40]
}
}
]
},
{
name: "Joanna",
addresses: [
// Similar array of her addresses
]
}
现在,我有一个坐标x = (0.0001, 0.0001)
。我想让集合中所有具有接近此地址的人,而仅获得响应中的那些地址。对于查询坐标为x
,我只想在响应中添加John的第一个地址:
{
name: "John",
addresses: [
{
city: "London",
location: {
type: "Point",
coordinates: [0, 0]
}
}
]
}
我见过类似的示例,但是它们都返回整个文档,即它们将返回John的所有地址。如何仅返回查询坐标$
附近的地址(可能有多个地址,因此x
操作符无效)?>
P.S。 -我确实尝试过放松,然后检查(使用聚合框架),但这不允许我在管道的第一阶段以外的任何其他地方使用空间查询。
答案 0 :(得分:-1)
首先,您应该检查存在多少个地址。然后,如果大于0,则可以使用切片方法。如果地址数组的长度为零,则返回null。
db.collection.aggregate([
{
{$addFields: {'addressCount': {$size: '$addresses'}}},
{$addFields: {'firstAddress': {
$cond: {
if: { $gt: ['$addressCount', 0]},
then: { "$slice" : [ "$addresses" , 0, 1 ] },
else: null
}}
}},
"$project": {
"name": 1,
"firstAddress" : 1
}
}
])