【问题标题】:select data from mongodb which has different schema for every column从 mongodb 中选择每列都有不同架构的数据
【发布时间】:2020-04-09 22:06:27
【问题描述】:

我有 mongodb,它从防火墙接收数据,这个防火墙根据它所拥有的日志向 mongo 发送不同的数据,所以我的 mongo 集合有不同的记录 例如它有这样的记录

{ "_id" : ObjectId("5df2194d2d81db5e845586d7"), "sys" : "2019-11-28", "time" : ISODate("2019-11-28T16:18:15.238Z"), "time_rcvd" :ISODate(“2019-11-28T16:18:15.238Z”),“msg”:“”,“syslog_fac”:23,“syslog_sever”:6,“syslog_tag”:“16:”,“procid”:“ 16”、“pid”:“-”、“level”:“INFO”、“logtype”:“流量日志”、“time2”:“2019 年 11 月 28 日星期四 16:18:15 +0000”、“18: 14KayseriNetcom%%01SECLOG/6/SESSION_TEARDOWN(l):IPVer”:“4”,“协议”:“udp”,“SourceIP”:“10.5.5.30”,“国家”:“10.10.0.144”,“DestinationIP” :“10.10.0.144”,“SourcePort”:“56215”,“DestinationPort”:“162”,“BeginTime”:“1574957770”,“EndTime”:“1574957770”,“SendPkts”:“1”,“SendBytes” :“142”,“RcvPkts”:“0”,“RcvBytes”:“0”,“SourceVpnID”:“0”,“DestinationVpnID”:“0”,“SourceZone”:“隧道”,“DestinationZone”:“信任”,“PolicyName”:“tunnel_to_trust”,“CloseReason”:“老化”,“ApplicationName”:“SNMP。” }

还有这样的记录

{ "_id" : ObjectId("5df2194d2d81db5e845586d1"), "sys" : "2019-11-28", "time" : ISODate("2019-11-28T16:18:13.126Z"), "time_rcvd" :ISODate(“2019-11-28T16:18:13.126Z”),“msg”:“”,“syslog_fac”:23,“syslog_sever”:6,“syslog_tag”:“16:”,“procid”:“ 16”、“pid”:“-”、“level”:“INFO”、“logtype”:“URL LOGS”、“time2”:“2019 年 11 月 28 日星期四 16:18:13 +0000”、“18: 12KayseriNetcom%%01SECLOG/6/SESSION_TEARDOWN(l):IPVer":"4","协议":"icmp","国家":"10.10.0.26","DestinationIP":"10.10.0.26","SourcePort" :“8”,“DestinationPort”:“0”,“BeginTime”:“1574957867”,“EndTime”:“1574957867”,“SendPkts”:“1”,“SendBytes”:“60”,“RcvPkts”:“ 0”、“RcvBytes”:“0”、“SourceVpnID”:“0”、“DestinationVpnID”:“0”、“SourceZone”:“隧道”、“DestinationZone”:“信任”、“PolicyName”:“tunnel_to_trust” , "CloseReason" : "老化。" }

所以第一条记录有 ApplicationName 列,但第二条记录没有该列,所以当我尝试通过此代码使用 Laravel 选择 ApplicationName 时

$datas = Logss::select('ApplicationName')->offset(1)->limit( 10)->get()->toArray();

我收到此错误,因为第二行中没有 ApplicationName

未定义索引:应用程序名称

那么我该如何解决这个问题

【问题讨论】:

    标签: laravel mongodb


    【解决方案1】:

    如果您使用 jenssegers/laravel-mongodb 模块 (https://github.com/jenssegers/laravel-mongodb)。

    然后它有一个选项来检查是否匹配具有指定字段的文档。

    你可以在下面使用这样的东西:-

    Logss::where('ApplicationName', 'exists', true)->get();
    

    【讨论】:

    • 感谢您的回复,但是在这种情况下,如果找不到 ApplicationName 键,它不会返回一行,但我想做的是将 ApplicationName 设置为空白或 null 并继续,是可能吗?
    • 我不确定是否有直接的方法来实现这一点,但您可以采取一种解决方法,例如获取该字段不存在的文档,然后将两者的结果结合起来。日志:: where('ApplicationName','exists', false)->get();
    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2017-11-10
    相关资源
    最近更新 更多