mongodb 使用_id在聚合管道上获取“无法找到索引以验证连接字段是否唯一”

nfs0ujit  于 2023-06-29  发布在  Go
关注(0)|答案(1)|浏览(168)

我正在构建一个聚合管道,以合并来自同一DDBB上的2个集合的数据。源集合为TmpPersoOptins,目标为RecipientAggregate。源数据如下所示:

{
  "_id": 61231246,
  "PersoOptins": 1
}

目的地的数据如下所示:

{
    "_id" : NumberLong(1)
    "Member" : {
        "AccountState" : NumberInt(1),
        "BirthDate" : ISODate("1986-06-05T22:00:00.000+0000"),
        "CreationDate" : ISODate("2001-01-30T23:56:00.000+0000"),
        "Culture" : "fr-FR",
        "Email" : "test@hotmail.com",
        "FirstName" : "Lorem",
        "Gender" : NumberInt(1),
        "GodFatherId" : NumberLong(657),
        "LastName" : "Ipsum",
        "ModificationDate" : ISODate("2022-04-20T15:44:00.000+0000"),
        "SchemaVersion" : NumberInt(1),
        "SiteId" : NumberInt(1)
    }
}

我想将源属性“PersoOptins”添加到目标上不包含它的所有记录中。我正在合并on _id字段。这是我的管道:

[
  {
    $fill:
      {
        output: {
          OptinPerso: {
            value: 0,
          },
        },
      },
  },
  {
    $lookup:
      {
        from: "RecipientAggregate",
        localField: "_id",
        foreignField: "_id",
        pipeline: [
          {
            $match: {
              "Member.OptinPerso": {
                $exists: false,
              },
            },
          },
        ],
        as: "Result",
      },
  },
  {
    $unwind:
      {
        path: "$Result",
        preserveNullAndEmptyArrays: false,
      },
  },
  {
    $project:
      {
        _id: 1,
        "Member.OptinPerso": "$PersoOptins",
      },
  },
  {
    $merge:
      {
        into: "RecipientAggregate",
        on: "_id",
        whenMatched: "merge",
      },
  },
]

然而,我在合并阶段得到错误Cannot find index to verify that join fields will be unique,我找不到问题,因为用于连接的_id字段是两个集合的PK。唯一的区别是source _id字段是常规索引,而destination上的_id是聚集索引。有什么提示吗?

e4yzc0pl

e4yzc0pl1#

好吧,我找到了问题,张贴在这里只是为了记录。MongoDB 6.0.2上的合并管道步骤无法使用聚集索引。我必须添加一个新的常规唯一索引才能让它工作。

相关问题