我怎样才能使;更新的「;更新嵌套数组的字段时是否停止mongodb的操作?
我有这样一个数据库:我怎样才能使;更新的「;更新嵌套数组的字段时是否停止mongodb的操作?,mongodb,Mongodb,我有这样一个数据库: { "universe":"comics", "saga":[ { "name":"x-men", "characters":[ { "character&qu
{
"universe":"comics",
"saga":[
{
"name":"x-men",
"characters":[
{
"character":"wolverine",
"picture":"618035022351.png"
},
{
"character":"wolverine",
"picture":"618035022352.png"
}
]
}
]
},
{
"universe":"dc",
"saga":[
{
"name":"spiderman",
"characters":[
{
"character":"venom",
"picture":"618035022353.png"
}
]
}
]
}
使用此代码,我更新了字段,其中name:wolverine
:
db.getCollection('collection').findOneAndUpdate(
{
"universe": "comics"
},
{
$set: {
"saga.$[outer].characters.$[inner].character": "lobezno",
"saga.$[outer].characters.$[inner].picture": "618035022354.png"
}
},
/*{
"saga.characters": 1
},*/
{
"arrayFilters": [
{
"outer.name": "x-men"
},
{
"inner.character": "wolverine"
}
],
"multi":false
}
)
我只想更新第一个匹配的对象,并停止它
例如,如果我有一个100000个元素的数组,匹配的对象位于第十位,他将更新该记录,但他将继续遍历整个数组,这对我来说似乎无效,即使他已经进行了更新
注意:如果我在universe.saga.characters
中使用\u id
进行更新,而不是使用名称
进行更新,那么它仍然会在其余元素中循环
如何操作?使用arrayFilters
条件更新
我认为它不会通过循环查找和更新,而且集合中是否有100000个子文档也无关紧要,因为这里有一个很好的解释,并且已经提到:
定义一个标识符,以仅更新那些与$[]
arrayFilters中的相应筛选器文档匹配的数组元素
- 在更新文档中,使用
筛选位置运算符定义标识符,然后在数组筛选文档中引用该标识符。但是,如果标识符未包含在更新文档中,请确保不能为标识符创建数组筛选器文档$[]
\u id
你的观点
注意:如果我在universe.saga.characters
中使用\u id
进行更新,而不是使用名称进行更新,那么它仍然会在其余元素中循环
MongoDB肯定会使用\u id
索引。这是一个很好的问题,从这一点上你会得到一个更好的想法
使用索引字段更新
您可以根据update命令的查询部分创建索引,这里已经解释了为什么索引很重要
在您的示例中,让我们通过示例查看:
示例1:如果文档有两个子文档,当您更新并检查时,假设更新需要1秒
快速使用(此平台不支持更新查询)
示例2:如果文档有1000个子文档,当您更新并检查时,可能需要1秒以上的时间
如果在字段上提供索引(universe
、saga.characters.character
和saga.characters.picture
),那么肯定会比没有索引的情况下花费更少的时间,索引的主要优点是它将指向索引字段
快速使用(此平台不支持更新查询)
为字段创建索引
要进行更多的实验,请使用以上两个示例数据(带索引和不带索引),并检查executionStats
,您将获得更清晰的信息
哇,你真棒,这是很多有价值的信息。请原谅我的无知,但更清楚地说,我总结了这个问题:1-即使您使用
\u id
在嵌套数组中进行更新,其余元素是否会跟随循环,即使它找到了匹配项?我真的不知道更新的内部机制,它将如何搜索更新,但他们肯定会考虑这类问题,我的想法是“即使使用_id在嵌套数组中进行更新,其余元素是否会跟随循环”因为他们为什么提供了updateOne
功能?当first查找并更新时,可能会停止搜索。似乎难以置信,没有类似的文档。继续搜索,如果您发现任何内容,请更新,可能是我错了,或者添加的信息不完整,或者无法搜索相关信息。
db.maxData.createIndex({
"universe": 1,
"saga.characters.character": 1,
"saga.characters.picture": 1
})