首页 > 解决方案 > Mongodb:如何查询嵌套文档和顶级文档

问题描述

我有以下文件。请注意,顶级文档IDattribute1.subDocument

{
    "ID": "1",
    "attribute1": "123",
    "subDocument": [
      {
        "ID": "2",
        "attribute1": "456",
      },
      {
        "ID": "3",
        "attribute1": "567",
      }
    ]
  },
  {
    "ID": "4",
    "attribute1": "123",
    "subDocument": [
      {
        "ID": "5",
        "attribute1": "456",
      }
    ]
  }

现在我需要一个可以基于IDand进行搜索的查询attribute1。如果我给ID=1,attribute1=“123”,它应该返回第一个顶级文档,如下所示:

{
    "ID": "1",
    "attribute1": "123"
  }

如果我给ID=2,attribute1=“456”,它应该返回子文档的项目,如下所示:

     {
        "ID": "2",
        "attribute1": "456",
      }

我怎样才能做到这一点? 操场

标签: mongodbmongodb-query

解决方案


询问

  • 将根的 id/attribute 添加为子文档
  • 展开和替换ROOT=> 每个成员都成为 ROOT 文档
  • $match将文档与变量匹配

测试代码在这里

aggregate(
[{"$project": 
   {"subDocument": 
     {"$concatArrays": 
       ["$subDocument", [{"ID": "$ID", "attribute1": "$attribute1"}]]}}},
 {"$unwind": {"path": "$subDocument"}},
 {"$replaceRoot": {"newRoot": "$subDocument"}},
 {"$match" : {"ID" : your_id_var , "attribute1" : your_attr_var}}])

编辑

如果您有太多字段无法手动输入,您可以使用它,它将除"_id"and之外的所有字段作为子文档"subDocument"

测试代码在这里

aggregate(
[{"$project": 
   {"subDocument": 
     {"$concatArrays": 
       ["$subDocument",
         [{"$arrayToObject": 
            {"$filter": 
              {"input": {"$objectToArray": "$$ROOT"},
               "cond": 
               {"$and": 
                 [{"$ne": ["$$this.k", "subDocument"]},
                  {"$ne": ["$$this.k", "_id"]}]}}}}]]}}},
  {"$unwind": {"path": "$subDocument"}},
  {"$replaceRoot": {"newRoot": "$subDocument"}}
  {"$match" : {"ID" : your_id_var , "attribute1" : your_attr_var}}])

我们没有像remove(object,k)这样的运算符,这使得对象到数组、过滤器和返回对象(及其复杂)。

还有另一种解决方案,但也很复杂。


推荐阅读