从数组和 select 字段中过滤对象
filter object from array and select field
我有一个包含名称值对的对象列表,但我不知道如何从名称为特定值的数组中检索值。
例如:
{
"ordernumber" : "192915",
"orderparameters" : {
"list" : [
{
"composite" : null,
"name" : "CURRENCY_CODE",
"value" : "NOK",
"type" : "String"
},
{
"composite" : null,
"name" : "NEED_CUSTOMS_DOCUMENT",
"value" : "True",
"type" : "Boolean"
}
]}
}
现在我需要找到带有
的物品的价值
"name": "NEED_CUSTOMS_DOCUMENT"
所以在这种情况下
"value": "True"
我可以列出所有值
db.orders.aggregate({ $match: { ordernumber:'1234' } }, { $project: { 'orderparameters.list.name': 1 } }).pretty()
但是如何从具有该名称的索引中检索值字段?
每个文档的索引可能不同,所以我不能简单地查询“orderparameters.list.1.value”
优化您的聚合管道以包含另一个带有 $filter
运算符的阶段,这样您就可以根据给定条件过滤列表,如下所示:
db.orders.aggregate([
{ $match: {
ordernumber: "1234",
"orderparameters.list.name": "NEED_CUSTOMS_DOCUMENT"
} },
{ $project: {
list: {
$filter: {
input: "$orderparameters.list",
cond: { $eq: ["$$this.name", "NEED_CUSTOMS_DOCUMENT"] }
}
}
} },
{ $project: { values: "$list.value" } }
])
有专门为此设计的运算符
$elemMatch
The $elemMatch operator matches documents that contain an array field
with at least one element that matches all the specified query
criteria.
db.orders.aggregate({ $match: { 'orderparameters.list': { $elemMatch: { name: "NEED_CUSTOMS_DOCUMENT", value: "True" } } } })
db.orders.find({ 'orderparameters.list': { $elemMatch: { name: "NEED_CUSTOMS_DOCUMENT", value: "True" } } })
我有一个包含名称值对的对象列表,但我不知道如何从名称为特定值的数组中检索值。
例如:
{
"ordernumber" : "192915",
"orderparameters" : {
"list" : [
{
"composite" : null,
"name" : "CURRENCY_CODE",
"value" : "NOK",
"type" : "String"
},
{
"composite" : null,
"name" : "NEED_CUSTOMS_DOCUMENT",
"value" : "True",
"type" : "Boolean"
}
]}
}
现在我需要找到带有
的物品的价值"name": "NEED_CUSTOMS_DOCUMENT"
所以在这种情况下
"value": "True"
我可以列出所有值
db.orders.aggregate({ $match: { ordernumber:'1234' } }, { $project: { 'orderparameters.list.name': 1 } }).pretty()
但是如何从具有该名称的索引中检索值字段?
每个文档的索引可能不同,所以我不能简单地查询“orderparameters.list.1.value”
优化您的聚合管道以包含另一个带有 $filter
运算符的阶段,这样您就可以根据给定条件过滤列表,如下所示:
db.orders.aggregate([
{ $match: {
ordernumber: "1234",
"orderparameters.list.name": "NEED_CUSTOMS_DOCUMENT"
} },
{ $project: {
list: {
$filter: {
input: "$orderparameters.list",
cond: { $eq: ["$$this.name", "NEED_CUSTOMS_DOCUMENT"] }
}
}
} },
{ $project: { values: "$list.value" } }
])
有专门为此设计的运算符
$elemMatch
The $elemMatch operator matches documents that contain an array field with at least one element that matches all the specified query criteria.
db.orders.aggregate({ $match: { 'orderparameters.list': { $elemMatch: { name: "NEED_CUSTOMS_DOCUMENT", value: "True" } } } })
db.orders.find({ 'orderparameters.list': { $elemMatch: { name: "NEED_CUSTOMS_DOCUMENT", value: "True" } } })