Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MongoDB聚合查找中使用以$开头的字段_Mongodb_Mongodb Query_Aggregation Framework_Mongodb Lookup - Fatal编程技术网

在MongoDB聚合查找中使用以$开头的字段

在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

我有一个MongoDB数据库,它由使用Spring数据的Spring应用程序填充。我想执行一个手动查询来连接两个集合,并从这些数据中提取一些统计信息

第一个集合名为
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"
  } }
])