gpt4 book ai didi

arrays - 用于嵌入式集合的 MongoDB 首选模式。文档与数组

转载 作者:IT老高 更新时间:2023-10-28 13:07:50 25 4
gpt4 key购买 nike

我相信至少有两种方法可以在 mongodb 文档中嵌入数据。在一个简化的例子中,我们可以有这样的东西:

{
'name' : 'bill',
'lines': {
'idk73716': {'name': 'Line A'},
'idk51232': {'name': 'Line B'},
'idk23321': {'name': 'Line C'}
}
}

作为一个数组:

{
'name' : 'bill',
'lines': [
{'id': 'idk73716', 'name': 'Line A'},
{'id': 'idk51232', 'name': 'Line B'},
{'id': 'idk23321', 'name': 'Line C'}
]
}

正如您在此用例中所见,保留每行的 id 很重要。

我想知道这两种模式之间是否有优缺点。特别是在使用索引时,我觉得第二种可能更容易使用,因为可以在“lines.id”甚至“lines.name”上创建一个索引来搜索所有文档的 id 或名称。在第一个示例中,我没有找到任何有效的解决方案来索引 id('idk73716' 等)。

如果您有这样的用例,通常是否首选使用第二种方法?

最佳答案

在您的第一种方法中,您无法索引 id 字段,因为 id 用作键。它有点像键值字典。如果您有已知的 id 集(当然数量较少),这种方法很有用。假设在您的第一个示例中,id 在前面是众所周知的,

>>db.your_colleection.find()
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill",
"lines" : {
"idk73716" : { "name" : "Line A" },
"idk51232" : { "name" : "Line B" } ,
"idk23321": { "name" : "Line C" }
}
}

所以要查找 id 字段 idk73716 的值,您可以通过

 db.your_colleection.find({},{'lines.idk73716':1})
{ "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

空的 {} 表示查询,第二部分 {'lines.idk73716':1} 是查询选择器。

将 id 作为键具有单独选择特定字段的优势。 尽管 {'lines.idk73716':1} 是字段选择器,但在这里它用作查询和选择器。但这不能在您的第二种方法中完成。假设第二个集合是这样的

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>

并且你索引了字段id,所以如果你想通过id查询

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }
>

通过查看上面的输出,可以看出没有办法单独选择匹配的子(嵌入)文档,但在第一种方法中是可能的。这是 mongodb 的默认行为。

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

将获取所有行,而不仅仅是 idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
{
"id" : "idk73716",
"name" : "Line A"
},
{
"id" : "idk51232",
"name" : "Line B"
},
{
"id" : "idk23321",
"name" : "Line C"
}
] }

希望对你有帮助

编辑

感谢 @Gates VP指出来

db.your_collection.find({'lines.idk73716':{$exists:true}}). If you want to use the "ids as keys" version, the exists query will work, but it will not be indexable

我们仍然可以使用 $exists 来查询 id,但它不会被索引

关于arrays - 用于嵌入式集合的 MongoDB 首选模式。文档与数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8077514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com