如果 MongoDB 中的条件用于嵌套 JSON 以检索特定值

Posted

技术标签:

【中文标题】如果 MongoDB 中的条件用于嵌套 JSON 以检索特定值【英文标题】:If condition in MongoDB for Nested JSON to retrieve a particular value 【发布时间】:2020-03-21 14:35:33 【问题描述】:

我已经像这样嵌套了 JSON。我想在第二级检索“_value”的值。 IE。 “活的有机体”这是我的 JSON 文档。

"name": "Biology Book", "data": "toc": "_version": "1", "ge": [ "_name": "The Fundamental Unit of Life", "_id": "5a", "ge": [ "_value": "Living Organisms", "_id": "5b" ] ]

这是我尝试过的,使用“_id”,我想检索它的“_value”

db.products.aggregate(["$match": "data.toc.ge.ge._id": "5b"])

【问题讨论】:

您在问题中提到的查询工作正常。您面临的问题是什么? @hushie 输出应为 ["Living Organisms"] 【参考方案1】:

这是我能得到的最接近您在上面评论中提到的输出。希望对您有所帮助。

db.collection.aggregate([
  
    $match: 
      "data.toc.ge.ge._id": "5b"
    
  ,
  
    $unwind: "$data.toc.ge"
  ,
  
    $unwind: "$data.toc.ge.ge"
  ,
  
    $group: 
      _id: null,
      book: 
        $push: "$data.toc.ge.ge._value"
      
    
  ,
  
    $project: 
      _id: 0,
      first: 
        $arrayElemAt: [
          "$book",
          0
        ]
      ,

    
  
])

输出:

[
  
    "first": "Living Organisms"
  
]

你可以查看我尝试过的here

【讨论】:

@hussie 你为什么使用聚合?我们不能用'find'吗? @G.Brown 要获得您要求的结果,我必须使用聚合,这允许我使用 $project, $unwind`。否则不能与 find 一起使用。【参考方案2】:

如果您使用的是 Mongoid:

(1..6).inject(Model.where('data.toc.ge.ge._id' => '5b').pluck('data.toc.ge.ge._value').first)  |v| v.values.first rescue v.first rescue v 
# => "Living Organisms"

6 是要从输出中修剪的容器数(4 个哈希和 2 个数组)。

【讨论】:

【参考方案3】:

如果我正确理解你的问题,你只关心_value,所以听起来你可能想要使用投影:

db.products.aggregate(["$match": "data.toc.ge.ge._id": "5b",  "$project": "data.toc.ge.ge._value": 1])

【讨论】:

以上是关于如果 MongoDB 中的条件用于嵌套 JSON 以检索特定值的主要内容,如果未能解决你的问题,请参考以下文章

mongodb aggregate

Mongodb多层嵌套数组如何精确查询(内容处为格式化的json截图,评论里面是json的内容)?

java中mongodb嵌套json查询?

如何使用嵌套的 json 对象填充 vue 条件库中的 vue 组件

mongodb 查询求助,嵌套数组里面查东西

MongoDB聚合(aggregate)常用操作及示例