mongodb 数据对象内又是数组对象 查找怎么查。
发布于 9 年前 作者 mrlong 19256 次浏览 最后一次编辑是 8 年前 来自 问答

如有这个文档,是一个多级的树结构 :

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 好像只支持一层的对象。我的是对象内又有数组,数组内可能又有对象是一个多级结构。

3 回复

回答前的问题: 你的 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就是Object4text值。更多内容请参阅 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 } ] }

回到顶部