如何基于深层嵌套的子文档获取父母的ID? [英] How to get ids of parents based on deeply nested sub document?

查看:69
本文介绍了如何基于深层嵌套的子文档获取父母的ID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题与较旧的问题接续:

This question is in continuation with older question: Parent.save() not working when sub document / deeply nested document is modified

说我有一个如下文件:

{
    "apiCallCount": 1,
    "_id": "5e0da052b4b3fe5188602e11",
    "email": "abc@def.net",
    "password": "123123",
    "userName": "username",
    "companyName": "companyName",
    "apiKey": "apiKey",
    "solutionType": "solutionType",
    "parentCompany": "parentCompany",
    "buildings": [
        {
            "gateways": [
                {
                    "devices": [
                        {
                            "_id": "5e0da052b4b3fe5188602e15",
                            "serialNumber": "serialNumber 1",
                            "area": "area",
                            "connectionStatus": 0,
                            "gatewayKey": "gatewayKey",
                            "applicationNumber": 11,
                            "firmwareVersion": "firmwareVersion",
                            "needsAttention": true,
                            "verificationCode": "123456",
                            "patientRiskStatus": "patientRiskStatus",
                            "patientFirstName": "UPDATED!!!",
                            "patientLastName": "patientLastName",
                            "createdAt": "2020-01-02T07:48:34.287Z",
                            "updatedAt": "2020-01-02T07:48:34.287Z"
                        },
                        {
                            "_id": "5e0da052b4b3fe5188602e14",
                            "serialNumber": "serialNumber 2",
                            "area": "area",
                            "connectionStatus": 0,
                            "gatewayKey": "gatewayKey",
                            "applicationNumber": 22,
                            "firmwareVersion": "firmwareVersion",
                            "needsAttention": true,
                            "verificationCode": "987654",
                            "patientRiskStatus": "patientRiskStatus",
                            "patientFirstName": "patientFirstName",
                            "patientLastName": "patientLastName",
                            "createdAt": "2020-01-02T07:48:34.288Z",
                            "updatedAt": "2020-01-02T07:48:34.288Z"
                        }
                    ],
                    "_id": "5e0da052b4b3fe5188602e13",
                    "gatewayName": "gatewayName 1",
                    "gatewayKey": "gatewayKey",
                    "suite": "suite",
                    "createdAt": "2020-01-02T07:48:34.288Z",
                    "updatedAt": "2020-01-02T07:48:34.288Z"
                }
            ],
            "_id": "5e0da052b4b3fe5188602e12",
            "buildingName": "buildingName 1",
            "address": "address",
            "suite": "suite",
            "floor": "floor",
            "timeZone": "String",
            "createdAt": "2020-01-02T07:48:34.288Z",
            "updatedAt": "2020-01-02T07:48:34.288Z"
        }
    ],
    "createdAt": "2020-01-02T07:48:34.289Z",
    "updatedAt": "2020-01-02T09:10:25.200Z",
    "__v": 0
}

我可以浏览文档并获取带有"verificationCode"的设备子文档:"123456"

I am able to dig through document and able to get device sub document with "verificationCode": "123456"

现在,我想获取此设备的gatewayID(一级)和buildingID(二级).

Now I want to get gatewayID(one level up) and buildingID(two level up) for this device.

目前,我有这样的电话: 我正在尝试基于深度嵌套的子文档更新父文档.

Currently I have a call like this : I am trying to update parent doc based on deeply nested sub-document.

我通过accountId和下面的验证码获取子文档. 然后需要更新父项.

I get sub document by accountId and verification code like below. and then need to update the parent.

在下面的示例中,我放置了我需要获取运行时间的硬编码ID.

In my sample below I Put hard-coded ids which i need to get run time.

if (newlySavedUser) {
            try {
                let result = await Account.findByIdAndUpdate(
                    accountId,
                    {
                        $set: {
                            "buildings.$[building].gateways.$[gateway].devices.$[device].patientFirstName": "userName",
                            "buildings.$[building].gateways.$[gateway].devices.$[device].patientLastName": "userName1"
                        }
                    },
                    {
                        arrayFilters: [

                            { "building._id": ObjectId("5d254bb179584ebcbb68b712") },  /// <----  I want to get this buildingId
                            { "gateway._id": ObjectId("5d254b64ba574040d9632ada") }, /// <----  I want to get this gatewayId
                            { "device.verificationCode": "4144" } /// <-- based on this verificationCode
                        ],
                        new: true
                    }
                );

                if (!result) return res.status(404);
                console.log(result)
                //res.send(result);
            } catch (err) {
                console.log(err);
                res.status(500).send("Something went wrong");
            }
        }

尝试使用"tom slabbaert"解决方案进行汇总.

Trying "tom slabbaert" solution for aggregate.

Account.aggregate([
                {
                    $unwind: "$buildings"
                },
                {
                    $unwind: "$gateways"
                },
                {
                    $match: {
                        "buildings.gateways.devices.verificationCode": "4144"
                    }
                },
                {
                    $project: {
                        buildingID: "$buildings._id",
                        gatewayID: "$gateways._id",
                    }
                }
            ]).exec((err, result)=>{
                console.log("result", result)
                if(err) throw err;
            });

感谢您的帮助.

推荐答案

您可以使用此三级$ unwind聚合,然后匹配所需的文档:

You can use this 3 level $unwind aggregation, and then match the document you want:

db.collection.aggregate([
  {
    $unwind: "$buildings"
  },
  {
    $unwind: "$buildings.gateways"
  },
  {
    $unwind: "$buildings.gateways.devices"
  },
  {
    $match: {
      "buildings._id": "5e0da052b4b3fe5188602e12",
      "buildings.gateways._id": "5e0da052b4b3fe5188602e13",
      "buildings.gateways.devices.verificationCode": "123456"
    }
  }
])

这将为您提供以下结果:

This will give you the following result:

[
  {
    "__v": 0,
    "_id": "5e0da052b4b3fe5188602e11",
    "apiCallCount": 1,
    "apiKey": "apiKey",
    "buildings": {
      "_id": "5e0da052b4b3fe5188602e12",
      "address": "address",
      "buildingName": "buildingName 1",
      "createdAt": "2020-01-02T07:48:34.288Z",
      "floor": "floor",
      "gateways": {
        "_id": "5e0da052b4b3fe5188602e13",
        "createdAt": "2020-01-02T07:48:34.288Z",
        "devices": {
          "_id": "5e0da052b4b3fe5188602e15",
          "applicationNumber": 11,
          "area": "area",
          "connectionStatus": 0,
          "createdAt": "2020-01-02T07:48:34.287Z",
          "firmwareVersion": "firmwareVersion",
          "gatewayKey": "gatewayKey",
          "needsAttention": true,
          "patientFirstName": "UPDATED!!!",
          "patientLastName": "patientLastName",
          "patientRiskStatus": "patientRiskStatus",
          "serialNumber": "serialNumber 1",
          "updatedAt": "2020-01-02T07:48:34.287Z",
          "verificationCode": "123456"
        },
        "gatewayKey": "gatewayKey",
        "gatewayName": "gatewayName 1",
        "suite": "suite",
        "updatedAt": "2020-01-02T07:48:34.288Z"
      },
      "suite": "suite",
      "timeZone": "String",
      "updatedAt": "2020-01-02T07:48:34.288Z"
    },
    "companyName": "companyName",
    "createdAt": "2020-01-02T07:48:34.289Z",
    "email": "abc@def.net",
    "parentCompany": "parentCompany",
    "password": "123123",
    "solutionType": "solutionType",
    "updatedAt": "2020-01-02T09:10:25.200Z",
    "userName": "username"
  }
]

Mongoplayground

这篇关于如何基于深层嵌套的子文档获取父母的ID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆