【发布时间】:2017-02-20 20:29:12
【问题描述】:
我在 MongoDB 中使用以下格式存储文档:
{
"id" : "123",
"tenure" : "360",
"details" : [
{
"trancheID" : "8087ed47-6e94-4733-ab0d-379ad420fbe2",
"amount" : "26000",
"status" : 2
},
{
"trancheID" : "096856fc-dac4-4dc9-af36-3764ffb9ab3b",
"amount" : "26000",
"status" : 2
},
{
"trancheID" : "45752678-04e6-490c-9836-d6c4a361e1d0",
"amount" : "26000",
"status" : 1
}
]
}
更新文档中的特定字段时,使用位置运算符$ 访问字段时设置新值的正确方法是什么?
在本例中,我想更新第三个元素的amount 和status,即查找条件为
{ "details.trancheID" : "45752678-04e6-490c-9836-d6c4a361e1d0" }
要更新字段,我有两种方法:
- 在客户端(java应用程序)构造新对象并在整个对象上使用
$set,{ "$set" : { "details.$" : { // 这里是完整的对象 } }
因此,位置运算符将选择第一个匹配元素(使用trancheID 上的条件)并设置更新的对象。在这种方法中,我必须将整个对象(其大小可以达到 2KB)从应用程序发送到 MongoDB。
- 只设置查询中需要更新的字段,
{ "$set" : { "details.$.amount" : 50000", "details.$.status" : 3 } }
在这种情况下,位置运算符必须执行两次。我担心的是,如果使用位置运算符设置多个字段,这是否会导致任何性能损失?在这里,只有两个字段正在更新。但它最多可以有 5-6 个字段,details 数组中的元素数量可能很多(在某些情况下为 50 个)。
目前,trancheID 字段不是索引字段,但我正在考虑将其作为稀疏索引。假设它是一个索引字段,哪种方法会好?
另外,如果您可以向我指出一些可以阅读和理解 MongoDB 内部工作原理的资源(例如位置运算符在内部的工作方式),那将非常有帮助。谢谢!
我正在使用 MongoDB 3.0。
【问题讨论】:
标签: mongodb