gpt4 book ai didi

arrays - 在 MongoDB 中返回数组项的子集

转载 作者:可可西里 更新时间:2023-11-01 09:51:13 25 4
gpt4 key购买 nike

任何人都可以就如何返回数组项的子集提供建议吗?例如,假设我有一组文档(类似于下面的示例),其中包含一个简单的 _id 键和一个包含对象数组的键。

我想找到所有 _id 和匹配一个简单条件的匹配对象:

// campaigns
{
"_id" : "Fred's C25K",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "nike"
},
{
"date" : "2015-06-17",
"source" : "reebok",
},
{
"date" : "2015-06-12",
"source" : "nike"
},
{
"date" : "2015-06-14",
"source" : "adidas"
},
]
},
{
"_id" : "Mike's Marathon",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "nike"
}
]
},
{
"_id" : "Jacob's Jamboree",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "keen"
}
]
}

我希望我的结果包含 _id 和任何匹配的对象,例如日期值“2015-06-17”

// GOAL => To generate a result set that looks like:
{
"_id" : "Fred's C25K",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "nike"
},
{
"date" : "2015-06-17",
"source" : "reebok",
}
]
},
{
"_id" : "Mike's Marathon",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "nike"
}
]
},
{
"_id" : "Jacob's Jamboree",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "keen"
}
]
}

最佳答案

使用 aggregation framework以达到预期的效果。以下管道由 $match 组成运算符阶段作为过滤应通过管道的文档的第一步。

下一阶段是 $addFields允许您输出包含输入文档中所有现有字段和新添加字段的文档的运算符。

在此步骤中,您可以使用 $filter运算符根据指定的过滤器选择要返回的数组的子集:

db.collection.aggregate([
{ "$match": {
"campaignData.date" : "2015-06-17"
} },
{ "$addFields": {
"campaignData": {
"$filter": {
"input": "$campaignData",
"cond": {
"$eq": ["$$this.date", "2015-06-17"]
}
}
}
} }
])

结果:

/* 0 */
{
"result" : [
{
"_id" : "Mike's Marathon",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "nike"
}
]
},
{
"_id" : "Jacob's Jamboree",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "keen"
}
]
},
{
"_id" : "Fred's C25K",
"campaignData" : [
{
"date" : "2015-06-17",
"source" : "nike"
},
{
"date" : "2015-06-17",
"source" : "reebok"
}
]
}
],
"ok" : 1
}

关于arrays - 在 MongoDB 中返回数组项的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com