嘿,我需要合并我的两个集合,但 mongo 返回“无法找到索引来验证连接字段是否唯一”
1.创建唯一索引 2.删除whenMatched/whenNotMatched
db.getCollection("GeoLite2-City-Blocks-IPv4").aggregate([
{$match:{longitude:{$gt:175,$lt:180}}},
{$merge:{
into:"GeoLite2-City-Locations-ja",
on:"geoname_id",
whenMatched: "replace",
whenNotMatched: "insert"
}}
])
预期:返回 GeoLite2-City-Blocks-IPv4 包括 GeoLite2-City-Locations-ja
$merge 聚合阶段需要标识符字段上的唯一索引:
$merge 需要一个唯一的索引,其键对应于 on 标识符字段。虽然索引键的顺序规范 没关系,唯一索引必须只包含 on 字段,如下所示 它的钥匙。
对于您的操作,
GeoLite2-City-Locations-ja
集合上需要存在一个包含字段 geoname_id
的唯一索引。
错误“找不到索引来验证连接字段是否唯一”基本上发生在 $merge 管道的新集合中,在您的情况下“GeoLite2-City-Locations-ja”不包含唯一字段“geoname_id”。相反,您可以在 $merge 管道的“on”属性中传递 _id 字段。
db.getCollection("GeoLite2-City-Blocks-IPv4").aggregate([
{$match:{longitude:{$gt:175,$lt:180}}},
{$merge:{
into:"GeoLite2-City-Locations-ja",
on:"_id",
whenMatched: "replace",
whenNotMatched: "insert"
}}
])
确保您的唯一索引 ID 为类型:ObjectID。