根据对象ID在猫鼬中创建新表

时间:2019-03-20 22:22:41

标签: javascript node.js mongodb mongoose

你好,这个问题的标题措辞很差,但是我会更好地解释这个问题。

我有一个名为“建筑物”的文档,也有两个名为“房间”和“登录”的文档。在会议室和登录名中,它们都有一个嵌入的建筑物文档,如下所示:

房间架构:

const roomSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 1,
    maxlength: 255
  },
  building: {
    type: new mongoose.Schema({
      name: {
        type: String,
        required: true,
        minlength: 1,
        maxlength: 255
      }
    }),
    required: true
  }
});

登录架构:

const loginSchema = new mongoose.Schema({
  user: {
    type: new mongoose.Schema({
      email: {
        type: String,
        required: true
      },
      isVisitor: {
        type: Boolean,
        required: true
      }
    })
  },
  dateIn: {
    type: Date,
    required: true,
    default: Date.now()
  },
  dateOut: {
    type: Date
  },
  building: {
    type: new mongoose.Schema({
      name: {
        type: String,
        required: true
      }
    })
  }
});

构建架构如下:

const Building = mongoose.model(
  "Building",
  new mongoose.Schema({
    name: {
      type: String,
      required: true,
      minlength: 1,
      maxlength: 255
    },
    address: {
      type: String,
      required: true,
      minlength: 1,
      maxlength: 255
    },
    postcode: {
      type: String,
      required: true,
      minlength: 6,
      maxlength: 8
    },
    organisation: {
      type: new mongoose.Schema({
        name: {
          type: String,
          required: true
        }
      })
    }
  })
);

以下是每个架构中的一些文档示例:

建筑物:

{
    "_id": "5c79a31ed2016312ecd27c46",
    "name": "TusPark",
    "site": {
        "_id": "5c79a243d2016312ecd27c45",
        "name": "TusPark Newcastle"
    },
    "__v": 0
},

房间:

{
    "_id": "5c7fa01abdd6233d6fdbc917",
    "name": "E101",
    "building": {
        "_id": "5c79a31ed2016312ecd27c46",
        "name": "TusPark"
    },
    "__v": 0
},

登录名:

{
    "dateIn": "2019-03-21T13:13:23.069Z",
    "_id": "5c938e151bd7a02d479893bd",
    "user": {
        "_id": "5c925378e88bb72764283108",
        "email": "jack1@gmail.com",
        "isVisitor": true
    },
    "building": {
        "_id": "5c79a31ed2016312ecd27c46",
        "name": "TusPark"
    },
    "__v": 0
}

我正在尝试向客户发送包含建筑物详细信息的文档,并将房间和登录信息作为相关建筑物的属性嵌入。我目前为此编写的代码如下:

router.get("/all", async (req, res) => {
  const buildings = await Building.find();

  const rooms = await Room.find({
    building_id: buildings._id
  });

  const logins = await Login.find({
    building_id: buildings._id
  });

  const building_rooms = await Building.aggregate([
    {
      $lookup: {
        from: "rooms",
        localField: "building_id",
        foreignField: "building_id",
        as: "building_rooms"
      }
    },
    {
      $lookup: {
        from: "logins",
        localField: "building_id",
        foreignField: "building_id",
        as: "building_logins"
      }
    }
  ]);

  res.send(building_rooms);
});

注意,我故意不包括$ unwind

此请求的当前输出为:

[
{
    "_id": "5c79a31ed2016312ecd27c46",
    "name": "Park",
    "site": {
        "_id": "5c79a243d2016312ecd27c45",
        "name": "Park Newcastle"
    },
    "__v": 0,
    "building_rooms": [
        {
            "_id": "5c7fa01abdd6233d6fdbc917",
            "name": "E101",
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0
        },
        {
            "_id": "5c7fdbd12229db40589e41b5",
            "name": "E202",
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0
        }
    ],
    "building_logins": [
        {
            "_id": "5c91483402d1a4145a2c4d9b",
            "dateIn": "2019-03-19T19:51:06.458Z",
            "user": {
                "_id": "5c83b4b87321805bad025e65",
                "email": "bob1999@gmail.com",
                "isVisitor": true
            },
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0,
            "dateOut": "2019-03-20T11:55:19.205Z"
        }
    ]
},
{
    "_id": "5c925475e88bb72764283113",
    "name": "Manchester",
    "site": {
        "_id": "5c921c94a922f6236cbe37d2",
        "name": "Manchester"
    },
    "__v": 0,
    "building_rooms": [
        {
            "_id": "5c7fa01abdd6233d6fdbc917",
            "name": "E101",
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0
        },
        {
            "_id": "5c7fdbd12229db40589e41b5",
            "name": "E202",
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0
        }
    ],
    "building_logins": [
        {
            "_id": "5c91483402d1a4145a2c4d9b",
            "dateIn": "2019-03-19T19:51:06.458Z",
            "user": {
                "_id": "5c83b4b87321805bad025e65",
                "email": "bob1999@gmail.com",
                "isVisitor": true
            },
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0,
            "dateOut": "2019-03-20T11:55:19.205Z"
        }
    ]
}

]

但是问题是“公园”的登录名和房间被嵌入曼彻斯特大厦中。这是不正确的。

正确的输出应为:

    [
{
    "_id": "5c79a31ed2016312ecd27c46",
    "name": "Park",
    "site": {
        "_id": "5c79a243d2016312ecd27c45",
        "name": "Park Newcastle"
    },
    "__v": 0,
    "building_rooms": [
        {
            "_id": "5c7fa01abdd6233d6fdbc917",
            "name": "E101",
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0
        },
        {
            "_id": "5c7fdbd12229db40589e41b5",
            "name": "E202",
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0
        }
    ],
    "building_logins": [
        {
            "_id": "5c91483402d1a4145a2c4d9b",
            "dateIn": "2019-03-19T19:51:06.458Z",
            "user": {
                "_id": "5c83b4b87321805bad025e65",
                "email": "bob1999@gmail.com",
                "isVisitor": true
            },
            "building": {
                "_id": "5c79a31ed2016312ecd27c46",
                "name": "Park"
            },
            "__v": 0,
            "dateOut": "2019-03-20T11:55:19.205Z"
        }
    ]
},
{
    "_id": "5c925475e88bb72764283113",
    "name": "Manchester",
    "site": {
        "_id": "5c921c94a922f6236cbe37d2",
        "name": "Manchester"
    },
    "__v": 0,
    "building_rooms": [],
    "building_logins": []
}

]

由于没有登录或房间的对象ID与曼彻斯特有关,因此没有building_rooms或b​​uilding_logs的实例。

我非常感谢您阅读本文所花的时间,对于解决此问题的任何帮助将不胜感激。

0 个答案:

没有答案
相关问题