如何在MongoDB中使用投影获取内部数据且不返回对象名
如何在Scala的MongoDB查询中直接获取嵌套的data对象内部数据(无需聚合)
我的MongoDB文档结构如下:
{ "data" : { "key1" : "value1", "key2" : "value2", "key10" : "value10" } }
用Json.obj("data" -> 1)做投影查询时,结果仍带着外层的data对象,但我想直接拿到内部的键值对集合,不想用聚合操作,也不想逐个指定内部字段。
方案1:查询后在Scala代码里直接提取
这是最直接且兼容性好的方式,拿到查询结果后,从返回的JSON对象中取出data字段的值就行。
假设你用的是Play JSON(从代码里的Json.obj判断大概率是),可以这么写:
// queryResult是查询返回的JsValue val innerData = (queryResult \ "data").getOrElse(Json.obj())
这样innerData就是你要的、直接包含key1到key10的JSON对象。
方案2:用MongoDB投影语法展开嵌套字段
如果想在数据库层面完成这个操作,可以尝试用通配符投影:
Json.obj("data.$" -> 1)
注意:这种写法在部分MongoDB驱动版本中可以直接把data下的所有子字段提升到顶层,但如果data是数组的话只会匹配第一个元素,不过你的场景里data是对象,这个写法适用。不过相比代码层面的提取,这种方式的兼容性可能略差,建议优先用方案1。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

