如有这个文档,是一个多级的树结构 :
var josndata ={
text:'xxxxx',
id: Objectid2,
children[
{text:'xxxxxx',id:Objectid2, children[ text:'xxxxx',id:Objectid3,children[... ]] },
{text:'xxxxxx',id:Objectid4, children[ text:'xxxxx',id:Objectid5,children[ ...]] }
}
}
我已知 Objectid3 , 想找到这个节点,并修改 text 的值,请问find() 怎么写。 我查过有数组对象的关键字:$elemMatch 好像只支持一层的对象。我的是对象内又有数组,数组内可能又有对象是一个多级结构。
回答前的问题: 你的 json 中祖父的 id 是不是打错了? 应该是 Object1 吧, 否则在逻辑上这个 json 有循环嵌套。但这不影响回答。
对问题的回答: 不幸的是你要求的这个更新或查询暂时无法实现, 但可能会在将来发布的 mongoDB 3.1 版本中实现, 见 issue: https://jira.mongodb.org/browse/SERVER-831
但幸运的是如果你想更改 Object4 的 text 或者其他 field 的值, 是可以的, 用 $
操作符可以实现, 例如:
db.collectionName.update(
{ id: Objectid1, 'children.id': Object4 },
{ $set: { 'children.$.text': 'This is Object4' } }
)
在查询部分, 你可以直接使用 ArrayName.fieldName
对数组进行查找。 而在更新部分, $
占位符代表你查询部分找到的数组元素, 进而children.$.text
就是Object4
的text
值。更多内容请参阅 mongodb手册
建议:如果你是在需要对多重数组中的元素进行更新,请在 app 中得到祖父文件, 用编程语言更改数组元素, 再将祖父文件更新回数据库。
@sadleader 感谢你的回答。 让我知道现在2.6版本没有这个功能。你后面附上的方法我感到太复杂了。如将整理取出来,再处理就不有树型的优势。 现在只能向改变模型来处理。
@sadleader 我的设计修改如下:
var josndata ={ text:‘xxxxx’, id: Objectid2, children[ {text:‘xxxxxx’,id:Objectid2, pid:objectid }, {text:‘xxxxxx’,id:Objectid4, pid:objectid } ] }