在MongoDB聚合查找中使用以$开头的字段
我有一个MongoDB数据库,它由使用Spring数据的Spring应用程序填充。我想执行一个手动查询来连接两个集合,并从这些数据中提取一些统计信息 第一个集合名为在MongoDB聚合查找中使用以$开头的字段,mongodb,mongodb-query,aggregation-framework,mongodb-lookup,Mongodb,Mongodb Query,Aggregation Framework,Mongodb Lookup,我有一个MongoDB数据库,它由使用Spring数据的Spring应用程序填充。我想执行一个手动查询来连接两个集合,并从这些数据中提取一些统计信息 第一个集合名为emailCampaign,包含以下信息(简化): 第二个集合名为ActivityDelivery,包含以下信息(简化): 最终,我想获得这两个交付的总和字段,但到目前为止,我仍然坚持使用基本联接: db.emailCampaign.aggregate([ { $lookup: { from: 'campaig
emailCampaign
,包含以下信息(简化):
第二个集合名为ActivityDelivery
,包含以下信息(简化):
最终,我想获得这两个交付的总和
字段,但到目前为止,我仍然坚持使用基本联接:
db.emailCampaign.aggregate([
{
$lookup: {
from: 'campaignDelivery',
localField: '_id',
foreignField: 'campaign.$id',
as: 'deliveries'
}
}
])
引发以下错误:
字段路径字段名不能以“$”开头
转义美元没有任何影响,我无法找到任何以美元开头的字段的示例。您可以通过在子查询中使用with来解决此问题,以访问
活动。$id
:
db.emailCampaign.aggregate([
{ $lookup: {
from: "campaignDelivery",
let: { id: "$_id" },
pipeline: [
{ $addFields: {
refId: { $arrayElemAt: [
{ $filter: {
input: { $objectToArray: "$campaign" },
cond: { $eq: [ "$$this.k", { $literal: "$id" } ] }
} }
, 0
] }
} },
{ $match: {
$expr: { $eq: [
"$refId.v",
"$$id"
] }
} },
{ $project: {
refId: 0
} }
],
as: "deliveries"
} }
])
您可以通过在子查询中使用with来访问
活动来解决此问题。$id
:
db.emailCampaign.aggregate([
{ $lookup: {
from: "campaignDelivery",
let: { id: "$_id" },
pipeline: [
{ $addFields: {
refId: { $arrayElemAt: [
{ $filter: {
input: { $objectToArray: "$campaign" },
cond: { $eq: [ "$$this.k", { $literal: "$id" } ] }
} }
, 0
] }
} },
{ $match: {
$expr: { $eq: [
"$refId.v",
"$$id"
] }
} },
{ $project: {
refId: 0
} }
],
as: "deliveries"
} }
])
是的,这不是最漂亮的解决方案,但这是管道作者的建议,直到他们提出更好的解决方案。是的,这不是最漂亮的解决方案,但这是管道作者的建议,直到他们提出更好的解决方案
db.emailCampaign.aggregate([
{ $lookup: {
from: "campaignDelivery",
let: { id: "$_id" },
pipeline: [
{ $addFields: {
refId: { $arrayElemAt: [
{ $filter: {
input: { $objectToArray: "$campaign" },
cond: { $eq: [ "$$this.k", { $literal: "$id" } ] }
} }
, 0
] }
} },
{ $match: {
$expr: { $eq: [
"$refId.v",
"$$id"
] }
} },
{ $project: {
refId: 0
} }
],
as: "deliveries"
} }
])