繁体   English   中英

node api 使用 mongoose 获取子文档

[英]node api to fetch subdocuments using mongoose

我的 MongoDB 存储具有以下结构的文档:

{
    "application_detail":{},
    "curl_detail":{
        "Curl1":{
            "key1":"value1",
            "key2":"value2"
        },
        "Curl2":{
            "key1":"value1",
            "key2":"value2"        
        },
        "Curl3":{
            "key1":"value1",
            "key2":"value2"
        },
        "Curl4":{
            "key1":"value1",
            "key2":"value2"
        },
        /*total number of curls are unknown*/
    }
}

如何使用 express 和curl_detail从 mongoDB 中获取 curl_detail 下存在的所有卷发的key1

预期输出:

{
    "curl_detail": {
        "Curl1": {
            "key1": "value1"
        },
        "Curl2": {
            "key1": "value1"
        },
        "Curl3": {
            "key1": "value1"
        },
        "Curl4": {
            "key1": "value1"
        }
    }
}

注意:卷发总数未知。

我想建议你改变数据结构

"curl_detail": {
    "Curl1": {
        "key1": "value1",
        "key2": "value2"
    },
    "Curl2": {
        "key1": "value1",
        "key2": "value2"
    }
}

"curl_detail": [{
        "key1": "value1",
        "key2": "value2"
    },
    {
        "key1": "value1",
        "key2": "value2"
    }
]

将数据结构存储在数组中可以让您以更简单的方式找到一些数据。 此外,不需要具有Curl1Curl2等属性的对象。

对于新的数据结构,已经有一些答案和解释:

1) Mongo 查找父键未知的值

2)当父键未知时按值查询MongoDB

3) MongoDB:在具有未知键的对象中查找给定字段值的文档

更新

如果无法更改数据结构,请参阅此解决方案(使用$arrayToObject / $objectToArray $arrayToObject来确定嵌套键的名称,例如“Curl1”的技巧):

db.collection.aggregate([{
        $addFields: {
            curl_detail: {
                $arrayToObject: {
                    $map: {
                        input: {
                            $objectToArray: "$curl_detail"
                        },
                        as: "details",
                        in: {
                            k: "$$details.k",
                            v: {
                                key1: "$$details.v.key1"
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            curl_detail: 1
        }
    }
])

这将输出以下内容:

[
  {
    "curl_detail": {
      "Curl1": {
        "key1": "value1"
      },
      "Curl2": {
        "key1": "value1"
      },
      "Curl3": {
        "key1": "value1"
      },
      "Curl4": {
        "key1": "value1"
      }
    }
  }
]

您可以通过Mongo Playground查看

您可以对要查找的查询使用投影:

collection.find({}, {"curl_detail":1}, (findError, results) => {
  if(findError) { 
    //handle the error
    return;
  }
  // here is the expected result
  console.log();
});

如果此结果也适用于您:

[
  {
    "curl_detail": {
      "Curl1": "value1",
      "Curl2": "value1",
      "Curl3": "value1",
      "Curl4": "value1"
    }
  }
]

您可以使用使用下面的聚集$ objectToArray$ arrayToObject

db.collection.aggregate([
  {
    $addFields: {
      curl_detail: {
        $map: {
          "input": {
            "$objectToArray": "$curl_detail"
          },
          "as": "el",
          "in": {
            "k": "$$el.k",
            "v": "$$el.v.key1",

          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      curl_detail: {
        $arrayToObject: "$curl_detail"
      }
    }
  }
])

操场

您可以像这样将这种聚合与猫鼬一起使用,假设您的模型是 MyModel:

MyModel.aggregate([
  {
    $addFields: {
      curl_detail: {
        $map: {
          input: {
            $objectToArray: '$curl_detail'
          },
          as: 'el',
          in: {
            k: '$$el.k',
            v: '$$el.v.key1'
          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      curl_detail: {
        $arrayToObject: '$curl_detail'
      }
    }
  }
]).then(res => {
  console.log(res);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM