MongoDB 仅从数组中的对象中获取选定的元素
MongoDB get only selected elements from objects inside an array
我拥有的是 MongoDB 中的文档集合,其结构类似于
[
{
"userid": "user1",
"addresses": [
{
"type": "abc",
"street": "xyz"
},
{
"type": "def",
"street": "www"
},
{
"type": "hhh",
"street": "mmm"
},
]
},
{
"userid": "user2",
"addresses": [
{
"type": "abc",
"street": "ccc"
},
{
"type": "def",
"street": "zzz"
},
{
"type": "hhh",
"street": "yyy"
},
]
}
]
如果我可以给出“type”和“userid”,我怎样才能得到结果
[
{
"userid": "user2",
"type": "abc",
"street": "ccc",
}
]
即使结果只得到“街道”也很好。唯一的限制是我需要在根元素本身而不是数组中获取它
您应该可以使用 unwind
、match
和 project
,如下所示:
db.collection.aggregate([
{
"$unwind": "$addresses"
},
{
"$match": {
"addresses.type": "abc",
"userid": "user1"
}
},
{
"$project": {
"_id": 0,
"street": "$addresses.street"
}
}
])
您也可以复制 match
步骤作为将文档数量减少到 unwind
的第一步。
这里是游乐场link。
有类似的question/answer.
像这样:
db.collection.aggregate([
{
$match: {
userid: "user1" , "address.type":"abc"
}
},
{
$project: {
userid: 1,
address: {
$filter: {
input: "$addresses",
as: "a",
cond: {
$eq: [
"$$a.type",
"abc"
]
}
}
}
}
},
{
$unwind: "$address"
},
{
$project: {
userid: 1,
street: "$address.street",
_id: 0
}
}
])
解释:
- 仅过滤具有您需要的用户 ID 和 addresess.type 的文档
- Project/Filter 仅处理具有所需类型的元素
- 展开地址数组
- 仅根据要求投影所需的元素
为获得最佳结果,请在 { userid:1 } 字段上创建索引或在 { userid:1 , address.type:1 } 字段上创建复合索引
我拥有的是 MongoDB 中的文档集合,其结构类似于
[
{
"userid": "user1",
"addresses": [
{
"type": "abc",
"street": "xyz"
},
{
"type": "def",
"street": "www"
},
{
"type": "hhh",
"street": "mmm"
},
]
},
{
"userid": "user2",
"addresses": [
{
"type": "abc",
"street": "ccc"
},
{
"type": "def",
"street": "zzz"
},
{
"type": "hhh",
"street": "yyy"
},
]
}
]
如果我可以给出“type”和“userid”,我怎样才能得到结果
[
{
"userid": "user2",
"type": "abc",
"street": "ccc",
}
]
即使结果只得到“街道”也很好。唯一的限制是我需要在根元素本身而不是数组中获取它
您应该可以使用 unwind
、match
和 project
,如下所示:
db.collection.aggregate([
{
"$unwind": "$addresses"
},
{
"$match": {
"addresses.type": "abc",
"userid": "user1"
}
},
{
"$project": {
"_id": 0,
"street": "$addresses.street"
}
}
])
您也可以复制 match
步骤作为将文档数量减少到 unwind
的第一步。
这里是游乐场link。
有类似的question/answer
像这样:
db.collection.aggregate([
{
$match: {
userid: "user1" , "address.type":"abc"
}
},
{
$project: {
userid: 1,
address: {
$filter: {
input: "$addresses",
as: "a",
cond: {
$eq: [
"$$a.type",
"abc"
]
}
}
}
}
},
{
$unwind: "$address"
},
{
$project: {
userid: 1,
street: "$address.street",
_id: 0
}
}
])
解释:
- 仅过滤具有您需要的用户 ID 和 addresess.type 的文档
- Project/Filter 仅处理具有所需类型的元素
- 展开地址数组
- 仅根据要求投影所需的元素
为获得最佳结果,请在 { userid:1 } 字段上创建索引或在 { userid:1 , address.type:1 } 字段上创建复合索引