【问题标题】:Want to join two collections and result should be filter from both collections [duplicate]想要加入两个集合,结果应该从两个集合中过滤[重复]
【发布时间】:2020-04-27 13:10:44
【问题描述】:
  {
    "_id" : ObjectId("5e8dae610b209222e10a0ac4"),
    "serial" : "2248",
    "externalId" : "452085",
     "hierarchyPathByIds" : ",5e2eb1662698a2097c71d855,",
    "status" : "ACTIVE",
 }
device_events collection {
  {
    "_id" : ObjectId("5e9d863a235721333eddfb81"),
    "deviceId" : "5e8dae610b209222e10a0ac4",
    "type" : "PACKAGE_TEST",
     "createdAt" : ISODate("2020-04-20T11:04:27.943Z")
}

注意 -> 必须在两个集合中获取具有相同设备 ID 的文档 如果没有任何与设备收集有关的事件,则不会产生结果。 设备事件也应该过滤最后一小时和类型。 1. 必须按设备事件创建日期降序获取所有设备。 2. hierarchyPathByIds 正则表达式模式匹配到'.,5e2eb1662698a2097c71d855,.'

设备有很多设备事件。

【问题讨论】:

  • 你能分享一下你尝试过的和没用的吗?
  • 我已经使用了聚合(查找)的东西,但它也不能满足我的要求...... { "serial" : "5e8ec16aaa0baa1ed8e5f22e", "_id" : "5e8ec16aaa0baa1ed8e5f22e", "deviceEvents" :[{“_id”:ObjectId(“5ea295598463e006c7a23633”),“deviceId”:“5e8ec16aaa0baa1ed8e5f22e”,“type”:“PACKAGE_TEST”,“createdAt”:ISODate(“2020-04-24T07:29:29.733Z”)} ] }

标签: mongodb


【解决方案1】:

由于您将deviceId 存储为String 在设备集合中,因此您必须转换

选项 1device 集合的 _id ObjectId 转换为 String

db.device.aggregate([
    {
        $project: {
            "_id": {
                "$toString": "$_id"
            },
            serial: 1,
            externalId: 1,
            status: 1

        }
    }, {
        $lookup: {
            from: 'device_events',
            localField: '_id',
            foreignField: 'deviceId',
            as: 'join'
        }
    }
])

选项 2device_events 集合的 deviceId String 转换为 ObjectId

db.device_events.aggerate([
    {
        $project: {
            "deviceObjId": {
                "$toObjectId": "$deviceId"
            },
            _id: 0,
            type: 1
        }
    }, {
        $lookup: {
            from: 'device',
            localField: 'deviceObjId',
            foreignField: '_id',
            as: 'join'
        }
    }
])

【讨论】:

  • 感谢您的回复,所以我也想发出空数组连接。 { "serial" : "2259", "_id" : "5e8f5028414a60740b9cee92", "join" : [] } ,我该怎么做?
  • 只需在查找后使用 {$unwind: "$join","preserveNullAndEmptyArrays": true}
  • 是的,那也很好。并且需要将正则表达式模式与设备集合字段匹配,我该怎么做?
  • 当你提问的时候,请把一切都说清楚,大部分开发者回复后删除三个代码。
猜你喜欢
  • 2021-01-16
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2018-06-03
  • 2013-03-11
相关资源
最近更新 更多