0

刚接触mongo,希望mongo大佬解惑,感谢。

需求

数据结构中有有个数组`malIps`,这个数组中有个字段`attack`,想对malIps这个数组进行分页,并且不返回`attack`这个数组对象。

mongo中存储的数据结构:

<code class="hljs language-javascript">{
        <span class="hljs-string">"_id"</span> : ObjectId(<span class="hljs-string">"60ab1cd22119d970838a7db8"</span>),
        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">7</span>,
        <span class="hljs-string">"logTotal"</span> : <span class="hljs-number">48500</span>,
        <span class="hljs-string">"attackTotal"</span> : <span class="hljs-number">9758</span>,
        <span class="hljs-string">"attackTypeTotal"</span> : {
                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
        },
        <span class="hljs-string">"malIpTotal"</span> : <span class="hljs-number">3</span>,
        <span class="hljs-string">"malIps"</span> : [
                {
                        <span class="hljs-string">"attackCounts"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"telecomOperator"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"finishTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                        <span class="hljs-string">"isMalIp"</span> : <span class="hljs-literal">false</span>,
                        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"ip"</span> : <span class="hljs-string">"192.168.0.112"</span>,
                        <span class="hljs-string">"latitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"location"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"startTime"</span> : <span class="hljs-string">"2020-12-02 13:55:59"</span>,
                        <span class="hljs-string">"attackTypeTotal"</span> : {
                                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
                        },
                        <span class="hljs-string">"longitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"attack"</span> : [
                                {
                                        <span class="hljs-string">"dateTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                                        <span class="hljs-string">"lineNo"</span> : <span class="hljs-number">48224</span>,
                                        <span class="hljs-string">"log"</span> : <span class="hljs-string">"192.168.0.112 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/css//../../../WEB-INF/web.xml\u0000.jsp HTTP/1.1\" 404 242 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\""</span>,
                                        <span class="hljs-string">"filePath"</span> : <span class="hljs-string">"F:\\test\\logs\\apache\\access_log"</span>,
                                        <span class="hljs-string">"type"</span> : <span class="hljs-string">"Sensitivefile"</span>,
                                        <span class="hljs-string">"status"</span> : <span class="hljs-string">"404"</span>
                                },
                                {
                                        <span class="hljs-string">"dateTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                                        <span class="hljs-string">"lineNo"</span> : <span class="hljs-number">48272</span>,
                                        <span class="hljs-string">"log"</span> : <span class="hljs-string">"192.168.0.112 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/fonts/documents HTTP/1.1\" 404 228 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\""</span>,
                                        <span class="hljs-string">"filePath"</span> : <span class="hljs-string">"F:\\test\\logs\\apache\\access_log"</span>,
                                        <span class="hljs-string">"type"</span> : <span class="hljs-string">"XSS"</span>,
                                        <span class="hljs-string">"status"</span> : <span class="hljs-string">"404"</span>
                                }
                        ]
                },
                {
                        <span class="hljs-string">"attackCounts"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"telecomOperator"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"finishTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                        <span class="hljs-string">"isMalIp"</span> : <span class="hljs-literal">false</span>,
                        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"ip"</span> : <span class="hljs-string">"192.168.0.113"</span>,
                        <span class="hljs-string">"latitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"location"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"startTime"</span> : <span class="hljs-string">"2020-12-02 13:55:59"</span>,
                        <span class="hljs-string">"attackTypeTotal"</span> : {
                                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
                        },
                        <span class="hljs-string">"longitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"attack"</span> : [
                                {
                                        <span class="hljs-string">"dateTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                                        <span class="hljs-string">"lineNo"</span> : <span class="hljs-number">48224</span>,
                                        <span class="hljs-string">"log"</span> : <span class="hljs-string">"192.168.0.113 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/css//../../../WEB-INF/web.xml\u0000.jsp HTTP/1.1\" 404 242 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\""</span>,
                                        <span class="hljs-string">"filePath"</span> : <span class="hljs-string">"F:\\test\\logs\\apache\\access_log"</span>,
                                        <span class="hljs-string">"type"</span> : <span class="hljs-string">"Sensitivefile"</span>,
                                        <span class="hljs-string">"status"</span> : <span class="hljs-string">"404"</span>
                                },
                                {
                                        <span class="hljs-string">"dateTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                                        <span class="hljs-string">"lineNo"</span> : <span class="hljs-number">48300</span>,
                                        <span class="hljs-string">"log"</span> : <span class="hljs-string">"192.168.0.113 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/images/documents HTTP/1.1\" 404 229 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\""</span>,
                                        <span class="hljs-string">"filePath"</span> : <span class="hljs-string">"F:\\test\\logs\\apache\\access_log"</span>,
                                        <span class="hljs-string">"type"</span> : <span class="hljs-string">"XSS"</span>,
                                        <span class="hljs-string">"status"</span> : <span class="hljs-string">"404"</span>
                                }
                        ]
                },
                {
                        <span class="hljs-string">"attackCounts"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"telecomOperator"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"finishTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                        <span class="hljs-string">"isMalIp"</span> : <span class="hljs-literal">false</span>,
                        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"ip"</span> : <span class="hljs-string">"192.168.0.114"</span>,
                        <span class="hljs-string">"latitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"location"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"startTime"</span> : <span class="hljs-string">"2020-12-02 13:55:59"</span>,
                        <span class="hljs-string">"attackTypeTotal"</span> : {
                                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
                        },
                        <span class="hljs-string">"longitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"attack"</span> : [ ]
                }
        ]
}</code>


想得到的数据结构,得到`malIps`的前两条数据,不要`attack`字段,如下:

<code class="hljs language-javascript">{
        <span class="hljs-string">"_id"</span> : ObjectId(<span class="hljs-string">"60ab1cd22119d970838a7db8"</span>),
        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">7</span>,
        <span class="hljs-string">"logTotal"</span> : <span class="hljs-number">48500</span>,
        <span class="hljs-string">"attackTotal"</span> : <span class="hljs-number">9758</span>,
        <span class="hljs-string">"attackTypeTotal"</span> : {
                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
        },
        <span class="hljs-string">"malIpTotal"</span> : <span class="hljs-number">3</span>,
        <span class="hljs-string">"malIps"</span> : [
                {
                        <span class="hljs-string">"attackCounts"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"telecomOperator"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"finishTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                        <span class="hljs-string">"isMalIp"</span> : <span class="hljs-literal">false</span>,
                        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"ip"</span> : <span class="hljs-string">"192.168.0.112"</span>,
                        <span class="hljs-string">"latitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"location"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"startTime"</span> : <span class="hljs-string">"2020-12-02 13:55:59"</span>,
                        <span class="hljs-string">"attackTypeTotal"</span> : {
                                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
                        },
                        <span class="hljs-string">"longitude"</span> : <span class="hljs-string">""</span>
                },
                {
                        <span class="hljs-string">"attackCounts"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"telecomOperator"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"finishTime"</span> : <span class="hljs-string">"2020-12-03 16:05:46"</span>,
                        <span class="hljs-string">"isMalIp"</span> : <span class="hljs-literal">false</span>,
                        <span class="hljs-string">"attackTypeAmount"</span> : <span class="hljs-number">9758</span>,
                        <span class="hljs-string">"ip"</span> : <span class="hljs-string">"192.168.0.113"</span>,
                        <span class="hljs-string">"latitude"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"location"</span> : <span class="hljs-string">""</span>,
                        <span class="hljs-string">"startTime"</span> : <span class="hljs-string">"2020-12-02 13:55:59"</span>,
                        <span class="hljs-string">"attackTypeTotal"</span> : {
                                <span class="hljs-string">"scanrobots"</span> : <span class="hljs-number">330</span>,
                                <span class="hljs-string">"FileInclude"</span> : <span class="hljs-number">4020</span>,
                                <span class="hljs-string">"Javaouinstream"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Sensitivefile"</span> : <span class="hljs-number">4785</span>,
                                <span class="hljs-string">"SQLInjection"</span> : <span class="hljs-number">6</span>,
                                <span class="hljs-string">"Webshell"</span> : <span class="hljs-number">12</span>,
                                <span class="hljs-string">"XSS"</span> : <span class="hljs-number">599</span>
                        },
                        <span class="hljs-string">"longitude"</span> : <span class="hljs-string">""</span>
                }
        ]
}</code>


测试用数据插入:

<code class="hljs">insert({"attackTypeAmount":7,"logTotal":48500,"attackTotal":9758,"attackTypeTotal":{"scanrobots":330,"FileInclude":4020,"Javaouinstream":6,"Sensitivefile":4785,"SQLInjection":6,"Webshell":12,"XSS":599},"malIpTotal":3,"malIps":[{"attackCounts":9758,"telecomOperator":"","finishTime":"2020-12-03 16:05:46","isMalIp":false,"attackTypeAmount":9758,"ip":"192.168.0.112","latitude":"","location":"","startTime":"2020-12-02 13:55:59","attackTypeTotal":{"scanrobots":330,"FileInclude":4020,"Javaouinstream":6,"Sensitivefile":4785,"SQLInjection":6,"Webshell":12,"XSS":599},"longitude":"","attack":[{"dateTime":"2020-12-03 16:05:46","lineNo":48224,"log":"192.168.0.112 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/css//../../../WEB-INF/web.xml\u0000.jsp HTTP/1.1\" 404 242 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\"","filePath":"F:\\test\\logs\\apache\\access_log","type":"Sensitivefile","status":"404"},{"dateTime":"2020-12-03 16:05:46","lineNo":48272,"log":"192.168.0.112 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/fonts/documents HTTP/1.1\" 404 228 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\"","filePath":"F:\\test\\logs\\apache\\access_log","type":"XSS","status":"404"}]},{"attackCounts":9758,"telecomOperator":"","finishTime":"2020-12-03 16:05:46","isMalIp":false,"attackTypeAmount":9758,"ip":"192.168.0.113","latitude":"","location":"","startTime":"2020-12-02 13:55:59","attackTypeTotal":{"scanrobots":330,"FileInclude":4020,"Javaouinstream":6,"Sensitivefile":4785,"SQLInjection":6,"Webshell":12,"XSS":599},"longitude":"","attack":[{"dateTime":"2020-12-03 16:05:46","lineNo":48224,"log":"192.168.0.113 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/css//../../../WEB-INF/web.xml\u0000.jsp HTTP/1.1\" 404 242 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\"","filePath":"F:\\test\\logs\\apache\\access_log","type":"Sensitivefile","status":"404"},{"dateTime":"2020-12-03 16:05:46","lineNo":48300,"log":"192.168.0.113 - - [03/Dec/2020:16:05:46  0800] \"GET /noindex/common/images/documents HTTP/1.1\" 404 229 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21\"","filePath":"F:\\test\\logs\\apache\\access_log","type":"XSS","status":"404"}]},{"attackCounts":9758,"telecomOperator":"","finishTime":"2020-12-03 16:05:46","isMalIp":false,"attackTypeAmount":9758,"ip":"192.168.0.114","latitude":"","location":"","startTime":"2020-12-02 13:55:59","attackTypeTotal":{"scanrobots":330,"FileInclude":4020,"Javaouinstream":6,"Sensitivefile":4785,"SQLInjection":6,"Webshell":12,"XSS":599},"longitude":"","attack":[]}]});</code>


查了官方文档,find 和 slice好像实现不了,需要用aggregate() 并使用两个单独的$project可是官方没有对应的例子,咋都凑不出来。

https://docs.mongodb.com/manual/reference/operator/projection/slice/#examples

选择最佳答案