首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >确保嵌套重复实体的索引

确保嵌套重复实体的索引
EN

Stack Overflow用户
提问于 2019-06-06 05:51:34
回答 2查看 0关注 0票数 0

我需要对嵌套文档强制执行唯一约束,例如:

代码语言:javascript
复制
urlEntities:[ 
{“url”:“http://t.co/ujBNNRWb0y”,“display_url”:“bit.ly/11JyiVp”,“expanded_url”:
“http://bit.ly/11JyiVp”}, 
{“url”:“http://t.co/DeL6RiP8KR”,“display_url”:“ow.ly / i / 2HC9x”, 
“expanded_url”:“http://ow.ly/i/2HC9x”}
]

urldisplay_url并且expaned_url需要是独一无二的。如何ensureIndex在MongoDB中为这个条件发出命令?

此外,拥有这样的嵌套文档是一个很好的设计,还是应该将它们移动到一个单独的集合中,并从urlEntities?我这里新的MongoDB 引用它们,任何最佳实践建议都会有所帮助。

完整场景:

假设我在db中有如下文档,其中包含数百万个数据:

代码语言:javascript
复制
{“_ id”:{“$ oid”:“51f72afa3893686e0c406e19”},“user”:“test”,“urlEntities”:[{“url”:“http://t.co/64HBcYmn9g”,“display_url”: “ow.ly/nqlkP”,“expanded_url”:“http://ow.ly/nqlkP”}],“count”:0}

当我得到另一个具有类似urlEntities对象的文档时,我只需要更新用户和计数字段。首先,我考虑对urlEntities字段强制执行唯一约束,然后处理异常然后进行更新,否则如果我在插入之前检查每个条目是否存在,则会对性能产生重大影响。那么,我该如何强制执行唯一性urlEntities呢?我试过了

代码语言:javascript
复制
{"urlEntities.display_url":1,"urlEntities.expanded_url":1},{unique:true}

但是我仍然能够两次插入相同的文档而没有例外。

EN

回答 2

Stack Overflow用户

发布于 2019-06-06 13:56:26

对于嵌套文档的索引,请阅读此内容

关于第二部分(嵌套文档最佳实践) - 它实际上取决于您的业务逻辑和查询。如果这些嵌套文档作为第一类实体没有意义,这意味着你不会直接搜索它们,而只是在它们的父文档的上下文中,那么将它们嵌套是有意义的。否则你应该考虑将它们提取出去。

我认为你的问题没有绝对的答案。阅读有关索引的章节...它帮助了我很多。

票数 0
EN

Stack Overflow用户

发布于 2019-06-06 15:09:53

唯一性仅针对每个文档强制执行。您无法阻止以下操作(从您的示例中简化):

代码语言:javascript
复制
db.collection.ensureIndex( { 'urlEntities.url' : 1 } );
db.col.insert( {
    _id: 42,
    urlEntities: [
        { 
            "url" : "http://t.co/ujBNNRWb0y"
        },
        { 
            "url" : "http://t.co/ujBNNRWb0y"
        } 
    ]
});

类似地,嵌套文档的复合唯一键也会遇到同样的问题。

可以做的是以下几点:

代码语言:javascript
复制
db.collection.insert( {
    _id: 43,
    title: "This is an example",
} );
db.collection.update( 
    { _id: 43 },
    {
        '$addToSet': { 
            urlEntities: { 
                "url" : "http://t.co/ujBNNRWb0y" , 
                "display_url" : "bit.ly/11JyiVp" ,  
                "expanded_url" : "http://bit.ly/11JyiVp"
            }
        }
    }
);

现在,您的文档带有_id 43,其中包含一个urlEntities文档。如果再次运行相同的更新查询,则不会添加新的数组元素,因为url,display_url和expanded_url 的完整组合已经存在。

另外,请查看$addToSet查询运算符的示例:http//docs.mongodb.org/manual/reference/operator/addToSet/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100009081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档