raj*_*kar 3 mongodb mongodb-query nosql-aggregation aggregation-framework dynamodb-queries
我的 collection1 在项目字段中保存了 collection2 的 _ids ,如下所示:
{
"name": "adafd",
"employeeId": "employeeId",
"locations": [
"ObjectId(adfaldjf)",
"ObjectId(adfaldjf)",
"ObjectId(adfaldjf)",
"ObjectId(adfaldjf)",
"ObjectId(adfaldjf)",
"ObjectId(adfaldjf)"
]
}
Run Code Online (Sandbox Code Playgroud)
集合2如下
"collection2": [
{
"location": "india",
"states": [
{
"stateCode": "TN",
"districts": {
"cities": [
{
"code": 1,
"name": "xxx"
},
{
"code": 4,
"name": "zzz"
},
{
"code": 6,
"name": "yyy"
}
]
}
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我试图在查找后过滤 collection2 内的嵌套数组,如下所示:
db.collection.aggregate([
{
$lookup: {
from: "collection2",
localField: "locations",
foreignField: "_id",
as: "locations"
}
},
{
$match: {
"name": "adafd",
},
},
{
$project: {
'details': {
$filter: {
input: "$locations",
as: "location",
cond: {
"$eq": ["$$location.states.stateCode", "TN" ]
}
}
}
}
}
]
)
Run Code Online (Sandbox Code Playgroud)
它返回一个空数组locations。
我按如下方式修改了项目,以均匀地过滤投影中 collection2 数组内的状态,如下所示,但过滤器未应用。它返回数组内的所有数据states。
{
$project: {
'details': {
$filter: {
input: "$locations",
as: "location",
cond: {
$filter: {
input: "$location.states",
as: "state",
cond: {
"$eq": ["$$state.stateCode", "TN" ]
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经找到了几种与此相关的解决方案,但没有一个对我有用。因为我不想使用放松。有什么办法可以实现这个目标..?
注意:我不想在$lookup中使用管道,因为 DocumentDB 不支持它。查询中还应该有$unwind和$group 。
$match你的条件$lookup与收藏2$projectlocations按位置名称过滤$unwind解构locations数组$projectstates按州代码过滤$unwind解构states数组$project按cities城市代码过滤$unwind解构cities数组db.collection1.aggregate([
{ $match: { name: "adafd" } },
{
$lookup: {
from: "collection2",
localField: "locations",
foreignField: "_id",
as: "locations"
}
},
{
$project: {
locations: {
$filter: {
input: "$locations",
cond: { $eq: ["$$this.location", "india"] }
}
}
}
},
{ $unwind: "$locations" },
{
$project: {
locations: {
_id: "$locations._id",
location: "$locations.location",
states: {
$filter: {
input: "$locations.states",
cond: { $eq: ["$$this.stateCode", "TN"] }
}
}
}
}
},
{ $unwind: "$locations.states" },
{
$project: {
locations: {
_id: "$locations._id",
location: "$locations.location",
states: {
stateCode: "$locations.states.stateCode",
districts: {
cities: {
$filter: {
input: "$locations.states.districts.cities",
cond: { $eq: ["$$this.code", 1] }
}
}
}
}
}
}
},
{ $unwind: "$locations.states.districts.cities" }
])
Run Code Online (Sandbox Code Playgroud)
第二个选项不使用$unwind,而是可以使用$arrayElemAt,
db.collection1.aggregate([
{ $match: { name: "adafd" } },
{
$lookup: {
from: "collection2",
localField: "locations",
foreignField: "_id",
as: "locations"
}
},
{
$project: {
locations: {
$arrayElemAt: [
{
$filter: {
input: "$locations",
cond: { $eq: ["$$this.location", "india"] }
}
},
0
]
}
}
},
{
$project: {
locations: {
_id: "$locations._id",
location: "$locations.location",
states: {
$arrayElemAt: [
{
$filter: {
input: "$locations.states",
cond: { $eq: ["$$this.stateCode", "TN"] }
}
},
0
]
}
}
}
},
{
$project: {
locations: {
_id: "$locations._id",
location: "$locations.location",
states: {
stateCode: "$locations.states.stateCode",
districts: {
cities: {
$arrayElemAt: [
{
$filter: {
input: "$locations.states.districts.cities",
cond: { $eq: ["$$this.code", 1] }
}
},
0
]
}
}
}
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |