mongoDb:找不到索引来验证连接字段是否唯一

问题描述 投票:0回答:3

嘿,我需要合并我的两个集合,但 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

mongodb merge aggregate unique-index
3个回答
7
投票

$merge 聚合阶段需要标识符字段上的唯一索引

$merge 需要一个唯一的索引,其键对应于 on 标识符字段。虽然索引键的顺序规范 没关系,唯一索引必须只包含 on 字段,如下所示 它的钥匙。

对于您的操作,

GeoLite2-City-Locations-ja
集合上需要存在一个包含字段
geoname_id
的唯一索引。


0
投票

错误找不到索引来验证连接字段是否唯一基本上发生在 $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" 
}}

])


-2
投票

确保您的唯一索引 ID 为类型:ObjectID。

© www.soinside.com 2019 - 2024. All rights reserved.