﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-MONGODB</title><link>http://www.blogjava.net/paulwong/category/53872.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 19 Oct 2022 02:40:02 GMT</lastBuildDate><pubDate>Wed, 19 Oct 2022 02:40:02 GMT</pubDate><ttl>60</ttl><item><title>MONGODB SPRING DISTINCT</title><link>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 18 Oct 2022 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450835.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450835.html</trackback:ping><description><![CDATA[SPRING 框架下 如果要做去重，在数据量大的时候会爆ERROR，可改用如下 写法：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;needReorderCheck(String&nbsp;requestId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try(MongoCursor&lt;String&gt;&nbsp;mongoCursor&nbsp;=&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(mongoTemplate.getCollectionName(AccountNumProductLineIndex.class))<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.distinct(KEY,&nbsp;Filters.eq(REQUEST_ID,&nbsp;requestId),&nbsp;String.class)<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.iterator()<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>(MongoCursor&lt;Document&gt;&nbsp;mongoCursor&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(mongoTemplate.getCollectionName(AccountNumProductLineIndex.<span style="color: #0000FF; ">class</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.aggregate(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.asList(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.project(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.fields(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.excludeId(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.include(KEY),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.include(REQUEST_ID)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.match(Filters.eq(REQUEST_ID,&nbsp;requestId)),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.group("$"&nbsp;+&nbsp;KEY)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.allowDiskUse(<span style="color: #0000FF; ">true</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.iterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;breakMe&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("needReorderCheck.key&nbsp;--&gt;&nbsp;start");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(mongoCursor.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(breakMe)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoCursor.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;keyDocument&nbsp;=&nbsp;mongoCursor.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;keyDocument.getString("_id");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;mongoCursor.next().getString(KEY);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("needReorderCheck.keyDocument&nbsp;--&gt;&nbsp;{},&nbsp;key&nbsp;--&gt;&nbsp;{}",&nbsp;keyDocument,&nbsp;key);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>(MongoCursor&lt;Document&gt;&nbsp;indexMongoCursor&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(AccountNumProductLineIndex.COLLECTION_NAME)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.find(Filters.and(Filters.eq(REQUEST_ID,&nbsp;requestId),&nbsp;Filters.eq(KEY,&nbsp;key)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.iterator()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;preIndex&nbsp;=&nbsp;-1,&nbsp;currentIndex&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;preIndexDocument&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;currentIndexDocument;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(indexMongoCursor.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentIndexDocument&nbsp;=&nbsp;indexMongoCursor.next();<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(currentIndexDocument.toJson());</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(preIndexDocument&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentIndex&nbsp;=&nbsp;currentIndexDocument.getInteger(INDEX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preIndex&nbsp;=&nbsp;preIndexDocument.getInteger(INDEX);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(currentIndex&nbsp;-&nbsp;preIndex&nbsp;&gt;&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexMongoCursor.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakMe&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preIndexDocument&nbsp;=&nbsp;currentIndexDocument;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><img src ="http://www.blogjava.net/paulwong/aggbug/450835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-10-18 10:22 <a href="http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB SHELL</title><link>http://www.blogjava.net/paulwong/archive/2022/01/10/438649.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 10 Jan 2022 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/01/10/438649.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/438649.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/01/10/438649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/438649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/438649.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->mongo&nbsp;-u&nbsp;admin&nbsp;-p&nbsp;<span style="color: #800000; ">123456</span>&nbsp;--authenticationDatabase&nbsp;admin<br /><span style="color: #0000FF; ">use</span>&nbsp;admin<br />db.createUser({<br />&nbsp;user&nbsp;:&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">paul</span><span style="font-weight: bold;">"</span>,<br />&nbsp;pwd&nbsp;:&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">123456</span><span style="font-weight: bold;">"</span>,<br />&nbsp;roles&nbsp;:&nbsp;[{role&nbsp;:&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">readWrite</span><span style="font-weight: bold;">"</span>,&nbsp;db&nbsp;:&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">batch</span><span style="font-weight: bold;">"</span>}]<br />})<br /><br /><span style="color: #008000; ">#</span><span style="color: #008000; ">增加权限</span><span style="color: #008000; "><br /></span>db.grantRolesToUser(&nbsp;<br />&nbsp;&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">paul</span><span style="font-weight: bold;">"</span>,&nbsp;<br />&nbsp;&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">role</span><span style="font-weight: bold;">"</span>&nbsp;:&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">dbOwner</span><span style="font-weight: bold;">"</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">db</span><span style="font-weight: bold;">"</span>&nbsp;:&nbsp;<span style="font-weight: bold;">"</span><span style="font-weight: bold;">mcra</span><span style="font-weight: bold;">"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;]<br />)</div><img src ="http://www.blogjava.net/paulwong/aggbug/438649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-01-10 11:10 <a href="http://www.blogjava.net/paulwong/archive/2022/01/10/438649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEBFLUX + SPRING SESSION + REACTIVE MONGODB</title><link>http://www.blogjava.net/paulwong/archive/2021/12/22/436240.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 22 Dec 2021 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/12/22/436240.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436240.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/12/22/436240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436240.html</trackback:ping><description><![CDATA[<h2> 添加依赖，pom.xml</h2><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-webflux<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;spring&nbsp;session&nbsp;with&nbsp;mongodb&nbsp;</span><span style="color: #008000; ">--&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.session<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-session-data-mongodb<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-data-mongodb-reactive<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><br /><h2>配置文件，application.yaml</h2><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->spring:<br />&nbsp;&nbsp;&nbsp;session:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;store-type:&nbsp;mongodb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout:&nbsp;30s<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongodb:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collection-name:&nbsp;WEB_SESSIONS</div><br /><br /><h2>java配置，HttpSessionConfiguration.java：</h2><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.testmicroservicecommon.config;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.session.MongoSessionProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.session.SessionProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.context.properties.EnableConfigurationProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.session.config.ReactiveSessionRepositoryCustomizer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.session.data.mongo.ReactiveMongoSessionRepository;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.session.data.mongo.config.annotation.web.reactive.EnableMongoWebSession;<br /><br />@EnableMongoWebSession<br />@EnableConfigurationProperties(MongoSessionProperties.<span style="color: #0000FF; ">class</span>)<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;HttpSessionConfiguration&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReactiveSessionRepositoryCustomizer&lt;ReactiveMongoSessionRepository&gt;&nbsp;customize(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionProperties&nbsp;sessionProperties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MongoSessionProperties&nbsp;mongoSessionProperties<br />&nbsp;&nbsp;&nbsp;&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;c&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setMaxInactiveIntervalInSeconds((<span style="color: #0000FF; ">int</span>)sessionProperties.getTimeout().getSeconds());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.setCollectionName(mongoSessionProperties.getCollectionName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><img src ="http://www.blogjava.net/paulwong/aggbug/436240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-12-22 09:24 <a href="http://www.blogjava.net/paulwong/archive/2021/12/22/436240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB聚合资源</title><link>http://www.blogjava.net/paulwong/archive/2021/04/08/435847.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 08 Apr 2021 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/04/08/435847.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435847.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/04/08/435847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435847.html</trackback:ping><description><![CDATA[MongoDB Projections and Aggregations in Spring Boot<br /><a href="https://www.javaprogramto.com/2020/05/spring-boot-data-mongodb-projections-aggregations.html" target="_blank">https://www.javaprogramto.com/2020/05/spring-boot-data-mongodb-projections-aggregations.html</a><br /><br />In spring data mongodb how to achieve pagination for aggregation<br /><a href="https://stackoverflow.com/questions/34427241/in-spring-data-mongodb-how-to-achieve-pagination-for-aggregation" target="_blank">https://stackoverflow.com/questions/34427241/in-spring-data-mongodb-how-to-achieve-pagination-for-aggregation</a><br /><br />Create a ProjectionOperation with Difference with spring mongodb<br /><a href="https://stackoverflow.com/questions/46786577/create-a-projectionoperation-with-difference-with-spring-mongodb" target="_blank">https://stackoverflow.com/questions/46786577/create-a-projectionoperation-with-difference-with-spring-mongodb</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-04-08 13:38 <a href="http://www.blogjava.net/paulwong/archive/2021/04/08/435847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING DATA MONGODB 教程</title><link>http://www.blogjava.net/paulwong/archive/2020/11/20/435729.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 20 Nov 2020 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/11/20/435729.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435729.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/11/20/435729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435729.html</trackback:ping><description><![CDATA[<br /><a href="https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-mongodb" target="_blank">https://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-mongodb</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-11-20 14:45 <a href="http://www.blogjava.net/paulwong/archive/2020/11/20/435729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Finding slow queries in MongoDB</title><link>http://www.blogjava.net/paulwong/archive/2020/03/27/435309.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 27 Mar 2020 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/27/435309.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435309.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/27/435309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435309.html</trackback:ping><description><![CDATA[<h2><span style="box-sizing: border-box; font-weight: bolder;">Database&nbsp;Profiling</span></h2><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">MongoDB Profiler is&nbsp;a&nbsp;db profiling&nbsp;system&nbsp;that&nbsp;can&nbsp;help&nbsp;identify&nbsp;inefficient</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">or&nbsp;slow&nbsp;queries&nbsp;and&nbsp;operations.</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">Levels of profiles available are:</p><table style="border-collapse: collapse; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; font-size: 16px; background-color: #ffffff; width: 285px;"><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; width: 43px;"><p style="box-sizing: border-box; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">Level</span></p></td><td style="box-sizing: border-box; width: 242px;"><p style="box-sizing: border-box; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">Setting</span></p></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; width: 43px;"><p style="box-sizing: border-box; margin: 0px !important;">0</p></td><td style="box-sizing: border-box; width: 242px;"><p style="box-sizing: border-box; margin: 0px !important;">Off. &amp; No&nbsp;profiling</p></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; width: 43px;"><p style="box-sizing: border-box; margin: 0px !important;">1</p></td><td style="box-sizing: border-box; width: 242px;"><p style="box-sizing: border-box; margin: 0px !important;">On &amp; only&nbsp;includes slow operations</p></td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; width: 43px;"><p style="box-sizing: border-box; margin: 0px !important;">2</p></td><td style="box-sizing: border-box; width: 242px;"><p style="box-sizing: border-box; margin: 0px !important;">On &amp; Includes&nbsp;all&nbsp;operations</p></td></tr></tbody></table><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><br />We&nbsp;can&nbsp;enable it by&nbsp;setting&nbsp;the&nbsp;Profile&nbsp;level&nbsp;value&nbsp;using&nbsp;the&nbsp;following<br style="box-sizing: border-box;" />command&nbsp;in mongo&nbsp;shell :</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">"db.setProfilingLevel(1)"</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">By&nbsp;default,&nbsp;<a href="https://www.oodlestechnologies.com/blogs/Finding-slow-queries-in-MongoDB/#bin.mongod" title="mongod" style="box-sizing: border-box; color: #007bff; text-decoration-line: none; background-color: transparent;">mongod</a>&nbsp;records&nbsp;<span style="box-sizing: border-box; font-weight: bolder;">slow</span>&nbsp;queries&nbsp;to&nbsp;its&nbsp;log,&nbsp;as&nbsp;defined&nbsp;by&nbsp;<a href="https://www.oodlestechnologies.com/blogs/Finding-slow-queries-in-MongoDB/#operationProfiling.slowOpThresholdMs" title="operationProfiling.slowOpThresholdMs" style="box-sizing: border-box; color: #007bff; text-decoration-line: none; background-color: transparent;">slowOpThresholdMs</a>.<br /><br /></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">NOTE</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">Enabling&nbsp;database&nbsp;profiler&nbsp;puts&nbsp;negative&nbsp;impact&nbsp;on&nbsp;MongoDB&#8217;s&nbsp;performance.</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">It&#8217;s&nbsp;better&nbsp;to&nbsp;enable&nbsp;it&nbsp;for&nbsp;specific&nbsp;intervals&nbsp;&amp;&nbsp;minimal&nbsp;on&nbsp;Production&nbsp;Servers.</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">We can enable&nbsp;profiling&nbsp;on a mongod&nbsp;basis but This&nbsp;setting&nbsp;will&nbsp;not&nbsp;propagate<br style="box-sizing: border-box;" />across&nbsp;a&nbsp;replica&nbsp;set&nbsp;and&nbsp;sharded&nbsp;cluster.</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">We&nbsp;can&nbsp;view&nbsp;the&nbsp;output&nbsp;in&nbsp;the&nbsp;system.profile&nbsp;collection in&nbsp;<a href="https://www.oodlestechnologies.com/blogs/Finding-slow-queries-in-MongoDB/#bin.mongo" title="mongo" style="box-sizing: border-box; color: #007bff; text-decoration-line: none; background-color: transparent;">mongo</a>&nbsp;shell using show profile command,&nbsp;or using following:</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;"><span style="box-sizing: border-box; word-break: break-word; background-color: #ffff00;">db.system.profile.find(&nbsp;{&nbsp;millis&nbsp;:&nbsp;{&nbsp;$gt&nbsp;: 200&nbsp;}&nbsp;}&nbsp;)</span></span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">Command&nbsp;returns&nbsp;operations that took longer&nbsp;than 200&nbsp;ms.&nbsp;Similarly&nbsp;we<br style="box-sizing: border-box;" />can&nbsp;change&nbsp;the&nbsp;values&nbsp;as&nbsp;per&nbsp;our&nbsp;need.</p><h3><span style="box-sizing: border-box; font-weight: bolder;">Enabling&nbsp;profile&nbsp;for&nbsp;an&nbsp;entire&nbsp;mongod&nbsp;instance.</span></h3><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">For the purpose of development in&nbsp;testing,&nbsp;we&nbsp;can&nbsp;enable&nbsp;database&nbsp;profiling/settings for&nbsp;an&nbsp;<br style="box-sizing: border-box;" />entire&nbsp;<a href="https://www.oodlestechnologies.com/blogs/Finding-slow-queries-in-MongoDB/#bin.mongod" title="mongod" style="box-sizing: border-box; color: #007bff; text-decoration-line: none; background-color: transparent;">mongod</a>&nbsp;instance.&nbsp;The&nbsp;profiling&nbsp;level will be applied to&nbsp;all&nbsp;databases.</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">&nbsp;</p><h2><span style="box-sizing: border-box; font-weight: bolder;">NOTE:</span></h2><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">We&nbsp;<em style="box-sizing: border-box;">can't</em>&nbsp;enable the profiling settings on&nbsp;a&nbsp;<a href="https://www.oodlestechnologies.com/blogs/Finding-slow-queries-in-MongoDB/#bin.mongos" title="mongos" style="box-sizing: border-box; color: #007bff; text-decoration-line: none; background-color: transparent;">mongos</a>&nbsp;instance.&nbsp;To&nbsp;enable the profiling&nbsp;in</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">shard&nbsp;clusters,&nbsp;we&nbsp;have&nbsp;to&nbsp;enable/start profiling&nbsp;for&nbsp;each&nbsp;<a href="https://www.oodlestechnologies.com/blogs/Finding-slow-queries-in-MongoDB/#bin.mongod" title="mongod" style="box-sizing: border-box; color: #007bff; text-decoration-line: none; background-color: transparent;">mongod</a>&nbsp;instance&nbsp;in cluster.</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">&nbsp;</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">Query&nbsp;for the recent&nbsp;10 entries</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; word-break: break-word; background-color: #ffff00;">db.system.profile.find().limit(10).sort(&nbsp;{&nbsp;ts&nbsp;:&nbsp;1&nbsp;}&nbsp;).pretty()</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">&nbsp;</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">Collection&nbsp;with&nbsp;the&nbsp;slowest&nbsp;queries(No.&nbsp;</span><span style="box-sizing: border-box; font-weight: bolder;">O</span><span style="box-sizing: border-box; font-weight: bolder;">f&nbsp;queries)</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; word-break: break-word; background-color: #ffff00;">db.system.profile.group({key:&nbsp;{ns:&nbsp;true},&nbsp;initial:&nbsp;{count:&nbsp;0},&nbsp;reduce:&nbsp;function(obj,prev){&nbsp;prev.count++;}})</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">&nbsp;</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">Collection&nbsp;with&nbsp;the&nbsp;slowest&nbsp;queries(No.&nbsp;</span><span style="box-sizing: border-box; font-weight: bolder;">O</span><span style="box-sizing: border-box; font-weight: bolder;">f&nbsp;millis&nbsp;spent)</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; word-break: break-word; background-color: #ffff00;">db.system.profile.group({key:&nbsp;{ns:&nbsp;true},&nbsp;initial:&nbsp;{millis:&nbsp;0},&nbsp;reduce:&nbsp;function(obj,&nbsp;prev){&nbsp;prev.millis&nbsp;+=&nbsp;obj.millis;}})</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">&nbsp;</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">Most&nbsp;recent&nbsp;slow&nbsp;query</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; word-break: break-word; background-color: #ffff00;">db.system.profile.find().sort({$natural:&nbsp;-1}).limit(1)</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;">&nbsp;</p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; font-weight: bolder;">Single&nbsp;slowest&nbsp;query(Right&nbsp;now)</span></p><p style="box-sizing: border-box; font-size: 16px; color: #555555; font-family: &quot;Open Sans&quot;, sans-serif; background-color: #ffffff; margin: 0px !important;"><span style="box-sizing: border-box; word-break: break-word; background-color: #ffff00;">db.system.profile.find().sort({millis:&nbsp;-1}).limit(1)</span></p><img src ="http://www.blogjava.net/paulwong/aggbug/435309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-27 23:35 <a href="http://www.blogjava.net/paulwong/archive/2020/03/27/435309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Boot Data Mongodb Starter自动配置那些坑</title><link>http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 17 Mar 2020 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435271.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435271.html</trackback:ping><description><![CDATA[<div style="font-size: medium;"><div><p>正好做Mongodb主从复制尝试使用Spring Boot Data Mongodb Starter插件链接访问Mongodb数据库集群。</p><p>遇到的坑：</p><ul><li>spring.data.mongodb.host和spring.data.mongodb.port形式不适合集群配置，会报host无法识别异常</li><li>spring.data.mongodb.uri中经常抛出authentication failed异常</li></ul><p><br /></p><p>解决办法：</p><ol><li>&nbsp;对于第一个坑，请使用spring.data.mongodb.uri。<span style="background-color: yellow;">如果使用了uri，则其余的host/username/password/db/auth-db这些全部无效。</span></li><li>&nbsp;对于第二个坑，请在spring.data.mongodb.uri中指定replicaSet和authsource，另外记得把所有集群节点服务器地址都列全。<br /><span style="background-color: yellow;">如果auth-db和db是同一个，则无需加authsource，如果不同，则加authsource=admin</span></li></ol><p><br /></p><p>我没有把authsource指定，所以一直报authentication failed异常。然后只好一点点去发掘问题点，最后查到在com.mongodb.ConnectionString类中的createCredentials中<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">private</span>&nbsp;MongoCredential&nbsp;createCredentials(<span style="color: #0000FF; ">final</span>&nbsp;Map&lt;String,&nbsp;List&lt;String&gt;&gt;&nbsp;optionsMap,&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;userName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;password)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuthenticationMechanism&nbsp;mechanism&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;authSource&nbsp;=&nbsp;(database&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;?&nbsp;"admin"&nbsp;:&nbsp;database;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;gssapiServiceName&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;authMechanismProperties&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;key&nbsp;:&nbsp;AUTH_KEYS)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;getLastValue(optionsMap,&nbsp;key);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(value&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("authmechanism"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mechanism&nbsp;=&nbsp;AuthenticationMechanism.fromMechanismName(value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("authsource"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authSource&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("gssapiservicename"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gssapiServiceName&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("authmechanismproperties"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authMechanismProperties&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MongoCredential&nbsp;credential&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mechanism&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>&nbsp;(mechanism)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;GSSAPI:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createGSSAPICredential(userName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(gssapiServiceName&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;credential.withMechanismProperty("SERVICE_NAME",&nbsp;gssapiServiceName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;PLAIN:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createPlainCredential(userName,&nbsp;authSource,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;MONGODB_CR:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createMongoCRCredential(userName,&nbsp;authSource,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;MONGODB_X509:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createMongoX509Credential(userName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;SCRAM_SHA_1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createScramSha1Credential(userName,&nbsp;authSource,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;UnsupportedOperationException(format("The&nbsp;connection&nbsp;string&nbsp;contains&nbsp;an&nbsp;invalid&nbsp;authentication&nbsp;mechanism'.&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"'%s'&nbsp;is&nbsp;not&nbsp;a&nbsp;supported&nbsp;authentication&nbsp;mechanism",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mechanism));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(userName&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createCredential(userName,&nbsp;authSource,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(credential&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;authMechanismProperties&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(String&nbsp;part&nbsp;:&nbsp;authMechanismProperties.split(","))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;mechanismPropertyKeyValue&nbsp;=&nbsp;part.split(":");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mechanismPropertyKeyValue.length&nbsp;!=&nbsp;2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException(format("The&nbsp;connection&nbsp;string&nbsp;contains&nbsp;invalid&nbsp;authentication&nbsp;properties.&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"'%s'&nbsp;is&nbsp;not&nbsp;a&nbsp;key&nbsp;value&nbsp;pair",&nbsp;part));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;mechanismPropertyKeyValue[0].trim().toLowerCase();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;mechanismPropertyKeyValue[1].trim();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("canonicalize_host_name"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;credential.withMechanismProperty(key,&nbsp;Boolean.valueOf(value));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;credential.withMechanismProperty(key,&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;credential;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><p><br /></p><p>authSource默认会指向我们目标数据的数据库。然而在身份验证机制中我们通常需要指向admin。（非常想报粗口，代码作者在这里脑袋被men挤了么）。所以需要强制指定authSource中指定。具体指定方式如下：</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><pre bash"=""><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->mongodb://{用户名}:{密码}@{host1}:27017,{host2}:27017,{host3}:27017/{目标数据库}?replicaSet={复制集名称}&amp;write=1&amp;readPreference=primary&amp;authsource={授权数据库}</div></pre></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/435271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-17 09:39 <a href="http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongDB连接池参数serverSelectionTimeout、connectTimeout、maxWaitTime和socketTimeout介绍</title><link>http://www.blogjava.net/paulwong/archive/2020/03/07/435231.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 07 Mar 2020 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/07/435231.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435231.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/07/435231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435231.html</trackback:ping><description><![CDATA[<div>MongDB Client请求查询数据，需要包括五个阶段：</div><div></div><div>MongoDB Client需要找到可用的MongoDB Server</div><div>MongoDB Client需要和MongoDB Server建立（new）Connection</div><div>应用程序处理线程从Connection Pool中获取Connection</div><div>数据传输（获取连接后，进行Socket通信，获取数据）</div><div>断开Collection</div><div>那么，MongoDB Client驱动设置中网络相关等待超时参数serverSelectionTimeout、connectTimeout、maxWaitTime和socketTimeout分别对应上面哪个环节呢？</div><div></div><div>参数serverSelectionTimeout：对应第1个环节，即MongoDB Client需要找到可用的MongoDB Server所需要的等待时间，&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MongDB部署的生产一般由多个服务器组成，要么作为一个复制集或者作为一个分片集群，参数&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;serverSelectionTimeout的值即为多长时间内找不到合适服务器时候就决定放弃的时间间隔；</div><div></div><div>参数connectTimeout：对应第2个环节，每次创建Connection，对应的网络等待。单位毫秒数, 0表示没有限制；</div><div></div><div>参数maxWaitTime：对应第3个环节，应用程序处理线程从连接池中获取Collection，对应的网络等待时间。单位毫秒数，0表示&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;不等待，负数表示等待时间不确定；</div><div></div><div>参数socketTimeout：对应第4个环节，获取Connection后，就有了Socket通信，获取数据，即在MonogoDB Client&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 和MonogoDB Server的Socket通信过程中的网络等待时间。单位毫秒数，默认配置为0，也就是没有限制，&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 没有超 时限制，系统出了问题也不容易发现，应该根据实际情况，给出合理的超时时间。</div><div></div><div>&nbsp;</div><div></div><div>其他相关参数如下：</div><div></div><div>connectionsPerHost：对mongo实例来说，每个host允许链接的最大链接数,这些链接空闲时会放入池中,如果链接被耗尽，任何请求链接的操作会被阻塞等待链接可用,推荐配置10</div><div></div><div>minPoolsSize：当Connection空闲时,Connection Pool中最少Connection保有量；</div><div></div><div>threadsAllowedToBlockForConnectionMultiplier：每个Connection的可以阻塞等待的线程队列数，它以上面connectionsPerHost值相乘的结果就是阻塞等待的线程队列最大值。如果连接线程排满了队列就会抛出&#8220;Out of semaphores to get db&#8221;错误。</div><div></div><div>socketKeepAlive:该标志用于控制socket保持活动的功能，通过防火墙保持连接活着</div><div>socketKeepAlive=false</div><div></div><div>autoConnectRetry：这个控制是否在一个Connection时，系统会自动重试</div><div>#true:假如Connection不能建立时,驱动将重试相同的server,有最大的重试次数,默认为15次,这样可以避免一些server因为一些阻塞操作零时down而驱动抛出异常,这个对平滑过度到一个新的master,也是很有用的,注意:当集群为复制集时,驱动将在这段时间里,尝试链接到旧的master上,而不会马上链接到新master上</div><div>#false 当在进行socket读写时,不会阻止异常抛出,驱动已经有自动重建破坏链接和重试读操作. 推荐配置false</div><div>autoConnectRetry=false</div><div>#重新打开链接到相同server的最大毫秒数,推荐配置为0，如果 autoConnectRetry=true,表示时间为15s</div><div>#com.jd.mongodbclient2.mongo.JDClientMongo.maxAutoConnectRetryTime=false</div><div>#表示当没有手动关闭游标时,是否有一个自动释放游标对象的方法,如果你总是很小心的关闭游标,则可以将其设为false 推荐配置true<br /><br /><a href="https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options" target="_blank">https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options</a><br /></div><div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div><div>版权声明：本文为CSDN博主「pursuer211」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。</div><div>原文链接：https://blog.csdn.net/pursuer211/article/details/82994027</div><img src ="http://www.blogjava.net/paulwong/aggbug/435231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-07 20:58 <a href="http://www.blogjava.net/paulwong/archive/2020/03/07/435231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mongodb shell中select in 的实现</title><link>http://www.blogjava.net/paulwong/archive/2020/02/21/435146.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 21 Feb 2020 15:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/21/435146.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435146.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/21/435146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435146.html</trackback:ping><description><![CDATA[<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->var&nbsp;bookIds&nbsp;=&nbsp;db.likes.find({userId:100}).map(function(like)&nbsp;{&nbsp;<br />&nbsp;&nbsp;return&nbsp;like.bookId<span style="color: #008000; ">;</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; "><br /></span>})<span style="color: #008000; ">;<br /></span>var&nbsp;books&nbsp;=&nbsp;db.books.find({_id:{$in:bookIds}})<span style="color: #008000; ">;</span></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->db.REPORT_ITEM.count({REQUEST_ID&nbsp;:&nbsp;db.BATCH_CONTROL.find({&nbsp;FILE_NAME&nbsp;:&nbsp;"20200218_100000.file"&nbsp;}).map(function(like)&nbsp;{&nbsp;<br />&nbsp;&nbsp;return&nbsp;like._id<span style="color: #008000; ">;</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; "><br /></span>})<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">0</span><span style="color: #800000; font-weight: bold; ">]</span>.str,&nbsp;JOB_TYPE_ENUM:"CHECK"})</div><img src ="http://www.blogjava.net/paulwong/aggbug/435146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-21 23:10 <a href="http://www.blogjava.net/paulwong/archive/2020/02/21/435146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb错误记录</title><link>http://www.blogjava.net/paulwong/archive/2020/02/21/435142.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 21 Feb 2020 00:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/21/435142.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435142.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/21/435142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435142.html</trackback:ping><description><![CDATA[<a href="https://blog.csdn.net/wangxiaotongfan/article/details/81560463" target="_blank">https://blog.csdn.net/wangxiaotongfan/article/details/81560463</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-21 08:50 <a href="http://www.blogjava.net/paulwong/archive/2020/02/21/435142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB安装</title><link>http://www.blogjava.net/paulwong/archive/2019/11/15/434911.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 15 Nov 2019 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/11/15/434911.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434911.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/11/15/434911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434911.html</trackback:ping><description><![CDATA[<br />
<a href="https://www.jianshu.com/p/d3b31b7aa182" target="_blank">https://www.jianshu.com/p/d3b31b7aa182</a>&nbsp;<br /><br />后续初始化用户及数据库<br /><a href="http://www.qianduan8.com/1786.html" target="_blank">http://www.qianduan8.com/1786.html</a><br /><a href="https://zocada.com/setting-mongodb-users-beginners-guide/" target="_blank">https://zocada.com/setting-mongodb-users-beginners-guide/</a><br /><br />如果要以认证的方式登录，需加以下内容至/etc/mongod.conf<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->security:<br />&nbsp;&nbsp;authorization:&nbsp;enabled</div><br />如果用GUI连接数据库时，不显示数据库列表，要加权限：listDatabases<br /><a href="https://stackoverflow.com/questions/19458524/mongodb-show-dbs-and-show-log-without-clusteradmin-role" target="_blank">https://stackoverflow.com/questions/19458524/mongodb-show-dbs-and-show-log-without-clusteradmin-role</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-11-15 17:30 <a href="http://www.blogjava.net/paulwong/archive/2019/11/15/434911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB拓展操作</title><link>http://www.blogjava.net/paulwong/archive/2019/09/03/434556.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 03 Sep 2019 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/09/03/434556.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434556.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/09/03/434556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434556.html</trackback:ping><description><![CDATA[MongoTemplate使用Cursor处理大数量的数据<br /><a href="https://blog.csdn.net/ClementAD/article/details/55210973" target="_blank">https://blog.csdn.net/ClementAD/article/details/55210973</a><br /><br />Spring Data MongoDB系列之三：数据库批量操作<br /><a href="https://blog.csdn.net/sinat_24044957/article/details/80646292" target="_blank">https://blog.csdn.net/sinat_24044957/article/details/80646292</a><br /><br />Distinct in Spring Data MongoDB<br /><a href="https://stackoverflow.com/questions/19203724/distinct-in-spring-data-mongodb" target="_blank">https://stackoverflow.com/questions/19203724/distinct-in-spring-data-mongodb</a><br /><br />MONGODB　SQL语句<br /><a href="http://www.runoob.com/mongodb/mongodb-indexing.html" target="_blank">http://www.runoob.com/mongodb/mongodb-indexing.html</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-09-03 15:52 <a href="http://www.blogjava.net/paulwong/archive/2019/09/03/434556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Multiple MongoDB connectors with Spring Boot</title><link>http://www.blogjava.net/paulwong/archive/2019/06/20/433910.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 20 Jun 2019 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/20/433910.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433910.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/20/433910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433910.html</trackback:ping><description><![CDATA[<a href="http://blog.marcosbarbero.com/multiple-mongodb-connectors-in-spring-boot/" target="_blank">http://blog.marcosbarbero.com/multiple-mongodb-connectors-in-spring-boot/</a><br /><br /><a href="https://github.com/yinjihuan/spring-boot-starter-mongodb-pool" target="_blank">https://github.com/yinjihuan/spring-boot-starter-mongodb-pool</a><br /><br /><a href="https://github.com/lish1le/mongodb-plus" target="_blank">https://github.com/lish1le/mongodb-plus</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/433910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-20 15:12 <a href="http://www.blogjava.net/paulwong/archive/2019/06/20/433910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringBoot使用MongoDB异常问题</title><link>http://www.blogjava.net/paulwong/archive/2019/05/29/433819.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 29 May 2019 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/05/29/433819.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433819.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/05/29/433819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433819.html</trackback:ping><description><![CDATA[<a href="https://www.cnblogs.com/linzhanfly/p/9674778.html" target="_blank">https://www.cnblogs.com/linzhanfly/p/9674778.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/433819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-05-29 16:58 <a href="http://www.blogjava.net/paulwong/archive/2019/05/29/433819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB去除_class字段</title><link>http://www.blogjava.net/paulwong/archive/2019/05/29/433818.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 29 May 2019 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/05/29/433818.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433818.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/05/29/433818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433818.html</trackback:ping><description><![CDATA[加上此配置：<br /><br />MongodbConfiguration.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.MongoDbFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.convert.DbRefResolver;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.convert.MappingMongoConverter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.mapping.MongoMappingContext;<br />&nbsp;<br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AppMongoConfig&nbsp;{<br />&nbsp;&nbsp;@Autowired&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;MongoDbFactory&nbsp;mongoDbFactory;<br />&nbsp;<br />&nbsp;&nbsp;@Autowired&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;MongoMappingContext&nbsp;mongoMappingContext;<br />&nbsp;<br />&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MappingMongoConverter&nbsp;mappingMongoConverter()&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DbRefResolver&nbsp;dbRefResolver&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DefaultDbRefResolver(mongoDbFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;MappingMongoConverter&nbsp;converter&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MappingMongoConverter(dbRefResolver,&nbsp;mongoMappingContext);<br />&nbsp;&nbsp;&nbsp;&nbsp;converter.setTypeMapper(<span style="color: #0000FF; ">new</span>&nbsp;DefaultMongoTypeMapper(<span style="color: #0000FF; ">null</span>));<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;converter;<br />&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/433818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-05-29 14:18 <a href="http://www.blogjava.net/paulwong/archive/2019/05/29/433818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB健壮集群——用副本集做分片</title><link>http://www.blogjava.net/paulwong/archive/2015/12/18/428724.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 18 Dec 2015 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/18/428724.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428724.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/18/428724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428724.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;&nbsp;&nbsp;&nbsp;MongoDB分片+副本集健壮的集群方案多个配置服务器 多个mongos服务器&nbsp;&nbsp;每个片都是副本集 正确设置w架构图说明：1.&nbsp;&nbsp;&nbsp;此实验环境在一台机器上通过不同port和dbpath实现启动不同的mongod实例2.&nbsp;&nbsp;&nbsp;总的9个mongod实例，分别做成shard...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/12/18/428724.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/428724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-18 14:03 <a href="http://www.blogjava.net/paulwong/archive/2015/12/18/428724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Mongodb的复制集搭建高可用分片，Replica Sets + Sharding的搭建过程</title><link>http://www.blogjava.net/paulwong/archive/2015/12/18/428723.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 18 Dec 2015 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/18/428723.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428723.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/18/428723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 参考资料&nbsp;reference:&nbsp;&nbsp;http://mongodb.blog.51cto.com/1071559/740131&nbsp;&nbsp;http://docs.mongodb.org/manual/tutorial/deploy-shard-cluster/#sharding-setup-shard-collection感谢网友Mr.Sharp，他给了我很多...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/12/18/428723.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/428723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-18 13:54 <a href="http://www.blogjava.net/paulwong/archive/2015/12/18/428723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB的复制与分片</title><link>http://www.blogjava.net/paulwong/archive/2015/12/18/428720.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 18 Dec 2015 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/18/428720.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428720.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/18/428720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428720.html</trackback:ping><description><![CDATA[复制：为了防止单点故障，会有几个实例在运行，保持相同的数据。<br /><br /><ul><li>一般主从：一主多从，主作读写数据，从作从主备份数据用，如果主宕机，则整个MONGODB无法工作。</li></ul><ul><li>复制式主从：一动态主多从，主由选举产生，当中一个主宕机，其他的从会选出一个主。</li></ul><br />适用场景：高负荷的读多写少。<br /><br />分片：SHARDING，一般数据库中的分库分表，一个表分成几个表用。每个片再做复制。<br /><br />适用场景：高负荷的写多读少。即如果发现MONGODB写不能支撑了，则要转此模式。<br /><br />安装配置服务器，安装ROUTER：MONGOS，安装分片服务器，通知MONGOS挂载SHARD。<br /><br />如果只启用数据库的分片，则不同的表放在不同的分片上，即一个表只占一个分片，另一个表占另一个分片，如果做了表的分片，则此表会分布在所有分片上。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/428720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-18 13:21 <a href="http://www.blogjava.net/paulwong/archive/2015/12/18/428720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb的监控与性能优化</title><link>http://www.blogjava.net/paulwong/archive/2015/12/16/428691.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 16 Dec 2015 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/16/428691.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428691.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/16/428691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428691.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: .mongodb的监控&nbsp;mongodb可以通过profile来监控数据，进行优化。查看当前是否开启profile功能用命令db.getProfilingLevel() &nbsp;返回level等级，值为0|1|2，分别代表意思：0代表关闭，1代表记录慢命令，2代表全部开始profile功能为db.setProfilingLevel(level); &nbsp;#level等级，值同上l...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/12/16/428691.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/428691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-16 18:50 <a href="http://www.blogjava.net/paulwong/archive/2015/12/16/428691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB删除/新增/更改大量记录的方法</title><link>http://www.blogjava.net/paulwong/archive/2015/12/11/428617.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 11 Dec 2015 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/11/428617.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428617.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/11/428617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428617.html</trackback:ping><description><![CDATA[MONGODB中，由于删除大量记录会十分耗时，一般推荐由MONGODB自己在后台处理，只需在某个字段设一个索引的标签即可。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Indexed(expireAfterSeconds=180)<br /><span style="color: #0000FF; ">private</span>&nbsp;Date&nbsp;deletedAt;</div><br /><span style="color: red;">以上代码，如果字段</span><span style="font-size: 13px; color: red; background-color: #eeeeee;">deletedAt</span><span style="color: red;">有值，那么将在180秒后被MONGODB删除，如果没值不会被删除。</span><br /><br />批量新增，小批量更新，防止读取超时<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">private</span>&nbsp;&lt;T&gt;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;insertAll(List&lt;T&gt;&nbsp;list)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">null</span>&nbsp;!=&nbsp;list)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;total&nbsp;=&nbsp;list.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;(total&nbsp;+&nbsp;50000&nbsp;-1)&nbsp;/&nbsp;50000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;toIndex&nbsp;=&nbsp;((i&nbsp;+1)&nbsp;*&nbsp;50000&nbsp;&gt;&nbsp;total)&nbsp;?&nbsp;total&nbsp;:&nbsp;((i&nbsp;+1)&nbsp;*&nbsp;50000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("toIndex&nbsp;=&nbsp;"&nbsp;+&nbsp;toIndex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate1.insertAll(list.subList(i&nbsp;*&nbsp;50000,&nbsp;toIndex));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />批量更改<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.MongoTemplate;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.query.Criteria;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.query.Query;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.query.Update;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.gameapplication.yearendactivities.bigwheelgame.valueobject.SingleUseRedeemCode;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SingleUseRedeemCodeRepositoryImpl&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;SingleUseRedeemCodeRepositoryCustom{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;MongoTemplate&nbsp;mongoTemplate1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;batchUpdateSingleUseRedeemCodeList(String&nbsp;bigWheelGameAwardId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Query();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.addCriteria(Criteria.where("bigwheelgameawardid").is(bigWheelGameAwardId));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate1.updateMulti(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Update().set("bigwheelgameawardid",&nbsp;"-1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.set("deletedat",&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date()),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SingleUseRedeemCode.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><br /><h1>Expire Data from Collections by Setting TTL<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#expire-data-from-collections-by-setting-ttl" title="Permalink to this headline" style="box-sizing: border-box; color: #c60f0f; text-decoration: none; visibility: visible; font-size: 0.8em; padding: 0px 4px;">&#182;</a></h1><div style="box-sizing: border-box; color: #494747; font-family: Akzidenz, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff;"><p style="box-sizing: border-box; margin: 24px 0px;"><span style="box-sizing: border-box; font-style: italic;">New in version 2.2.</span></p></div><p style="box-sizing: border-box; margin: 24px 0px; color: #494747; font-family: Akzidenz, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff;">This document provides an introduction to MongoDB&#8217;s &#8220;<em style="box-sizing: border-box;">time to live</em>&#8221; or&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/glossary/#term-ttl" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">TTL</a>&nbsp;collection feature. TTL collections make it possible to store data in MongoDB and have the&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/program/mongod/#bin.mongod" title="mongod" style="box-sizing: border-box; color: #006cbc; text-decoration: none;"><tt mongodb="" mongodb-program="" docutils=""  literal"="" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; background-color: transparent;">mongod</tt></a>&nbsp;automatically remove data after a specified number of seconds or at a specific clock time.</p><p style="box-sizing: border-box; margin: 24px 0px; color: #494747; font-family: Akzidenz, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff;">Data expiration is useful for some classes of information, including machine generated event data, logs, and session information that only need to persist for a limited period of time.</p><p style="box-sizing: border-box; margin: 24px 0px; color: #494747; font-family: Akzidenz, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff;">A special&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/core/index-ttl/" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">TTL index property</a>&nbsp;supports the implementation of TTL collections. The TTL feature relies on a background thread in&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/program/mongod/#bin.mongod" title="mongod" style="box-sizing: border-box; color: #006cbc; text-decoration: none;"><tt mongodb="" mongodb-program="" docutils=""  literal"="" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; background-color: transparent;">mongod</tt></a>&nbsp;that reads the date-typed values in the index and removes expired&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/glossary/#term-document" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">documents</a>from the collection.</p><div id="procedures" style="box-sizing: border-box; margin-top: 48px; color: #494747; font-family: Akzidenz, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff;"><h2>Procedures<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#procedures" title="Permalink to this headline" style="box-sizing: border-box; color: #c60f0f; text-decoration: none; visibility: hidden; font-size: 0.8em; padding: 0px 4px;"></a></h2><p style="box-sizing: border-box; margin: 24px 0px; padding: 0px;">To create a&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/core/index-ttl/" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">TTL index</a>, use the&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/method/db.collection.createIndex/#db.collection.createIndex" title="db.collection.createIndex()" style="box-sizing: border-box; color: #006cbc; text-decoration: none;"><tt mongodb="" mongodb-method="" docutils=""  literal"="" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; background-color: transparent;">db.collection.createIndex()</tt></a>&nbsp;method with the<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>&nbsp;option on a field whose value is either a&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/bson-types/#document-bson-type-date" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">date</a>&nbsp;or an array that contains&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/bson-types/#document-bson-type-date" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">date values</a>.</p><div note"="" style="box-sizing: border-box; margin: 24px 0px; padding: 2px 12px 22px; width: auto; max-width: 100%; border-left-width: 5px; border-left-style: solid; border-color: #6ba442; background-color: #edf4e8;"><p admonition-title"="" style="box-sizing: border-box; margin: 0px; font-weight: bold; font-size: 12px; text-transform: uppercase; color: #89b668;">NOTE</p><p style="box-sizing: border-box; margin: 0px;">The TTL index is a single field index. Compound indexes do not support the TTL property. For more information on TTL indexes, see&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/core/index-ttl/" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">TTL Indexes</a>.</p></div><div id="expire-documents-after-a-specified-number-of-seconds" style="box-sizing: border-box; margin-top: 48px;"><h3>Expire Documents after a Specified Number of Seconds<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#expire-documents-after-a-specified-number-of-seconds" title="Permalink to this headline" style="box-sizing: border-box; color: #c60f0f; text-decoration: none; visibility: hidden; font-size: 0.8em; padding: 0px 4px;"></a></h3><p style="box-sizing: border-box; margin: 0px 0px 24px; padding: 0px;">To expire data after a specified number of seconds has passed since the indexed field, create a TTL index on a field that holds values of BSON date type or an array of BSON date-typed objects&nbsp;<em style="box-sizing: border-box;">and</em>&nbsp;specify a positive non-zero value in the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>&nbsp;field. A document will expire when the number of seconds in the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>&nbsp;field has passed since the time specified in its indexed field.&nbsp;<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#field-is-array-of-dates" id="id1" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">[1]</a></p><p style="box-sizing: border-box; margin: 24px 0px;">For example, the following operation creates an index on the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">log_events</tt>&nbsp;collection&#8217;s&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">createdAt</tt>&nbsp;field and specifies the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>&nbsp;value of&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">3600</tt>&nbsp;to set the expiration time to be one hour after the time specified by&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">createdAt</tt>.</p><div style="box-sizing: border-box;"><div style="box-sizing: border-box; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><pre style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: 14px; padding: 24px 12px; margin-top: 24px; margin-bottom: 24px; word-break: break-all; word-wrap: normal; color: #222222; border-left-width: 5px; border-style: none none none solid; border-left-color: #494747; border-radius: 0px; overflow: auto; background: url(&quot;https://media.mongodb.org/code-block-bg.png&quot;) 0px 0px repeat #f5f6f7;"><span style="box-sizing: border-box;">db</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">log_events</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">createIndex</span><span style="box-sizing: border-box;">(</span> <span style="box-sizing: border-box;">{</span> <span style="box-sizing: border-box; color: #4070a0;">"createdAt"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #208050;">1</span> <span style="box-sizing: border-box;">},</span> <span style="box-sizing: border-box;">{</span> <span style="box-sizing: border-box;">expireAfterSeconds</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #208050;">3600</span> <span style="box-sizing: border-box;">}</span> <span style="box-sizing: border-box;">)</span> </pre></div></div><p style="box-sizing: border-box; margin: 24px 0px;">When adding documents to the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">log_events</tt>&nbsp;collection, set the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">createdAt</tt>&nbsp;field to the current time:</p><div style="box-sizing: border-box;"><div style="box-sizing: border-box; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><pre style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: 14px; padding: 24px 12px; margin-top: 24px; margin-bottom: 24px; word-break: break-all; word-wrap: normal; color: #222222; border-left-width: 5px; border-style: none none none solid; border-left-color: #494747; border-radius: 0px; overflow: auto; background: url(&quot;https://media.mongodb.org/code-block-bg.png&quot;) 0px 0px repeat #f5f6f7;"><span style="box-sizing: border-box;">db</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">log_events</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">insert</span><span style="box-sizing: border-box;">(</span> <span style="box-sizing: border-box;">{</span>    <span style="box-sizing: border-box; color: #4070a0;">"createdAt"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #007020; font-weight: bold;">new</span> <span style="box-sizing: border-box; color: #007020;">Date</span><span style="box-sizing: border-box;">(),</span>    <span style="box-sizing: border-box; color: #4070a0;">"logEvent"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #208050;">2</span><span style="box-sizing: border-box;">,</span>    <span style="box-sizing: border-box; color: #4070a0;">"logMessage"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #4070a0;">"Success!"</span> <span style="box-sizing: border-box;">}</span> <span style="box-sizing: border-box;">)</span> </pre></div></div><p style="box-sizing: border-box; margin: 24px 0px;">MongoDB will automatically delete documents from the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">log_events</tt>&nbsp;collection when the document&#8217;s<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">createdAt</tt>&nbsp;value&nbsp;<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#field-is-array-of-dates" id="id2" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">[1]</a>&nbsp;is older than the number of seconds specified in&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>.</p><table footnote"="" frame="void" id="field-is-array-of-dates" rules="none" style="box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; max-width: 100%; border: 0px; font-size: 14px; line-height: 24px; margin: 24px 0px; background-color: transparent;"><colgroup style="box-sizing: border-box;"><col style="box-sizing: border-box;"><col style="box-sizing: border-box;"></colgroup><tbody valign="top" style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 11px 5px 12px; border: 0px #ebebed !important;">[1]</td><td style="box-sizing: border-box; padding: 11px 5px 12px; border: 0px #ebebed !important;"><em style="box-sizing: border-box;">(<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#id1" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">1</a>,&nbsp;<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#id2" style="box-sizing: border-box; color: #006cbc; text-decoration: none;">2</a>)</em>&nbsp;If the field contains an array of BSON date-typed objects, data expires if at least one of BSON date-typed object is older than the number of seconds specified in&nbsp;<tt literal"="" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>.</td></tr></tbody></table><div seealso"="" style="box-sizing: border-box; margin: 24px 0px; padding: 2px 12px 22px; width: auto; max-width: 100%; border-left-width: 5px; border-left-style: solid; border-left-color: transparent;"><p admonition-title"="" style="box-sizing: border-box; margin: 0px; font-weight: bold; font-size: 12px; text-transform: uppercase;">SEE ALSO</p><p style="box-sizing: border-box; margin: 0px;"><a internal"="" href="https://docs.mongodb.org/manual/reference/operator/update/currentDate/#up._S_currentDate" title="$currentDate" style="box-sizing: border-box; color: #006cbc; text-decoration: none;"><tt mongodb="" mongodb-update="" docutils=""  literal"="" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; background-color: transparent;">$currentDate</tt></a>&nbsp;operator</p></div></div><div id="expire-documents-at-a-specific-clock-time" style="box-sizing: border-box; margin-top: 48px;"><h3>Expire Documents at a Specific Clock Time<a href="https://docs.mongodb.org/manual/tutorial/expire-data/#expire-documents-at-a-specific-clock-time" title="Permalink to this headline" style="box-sizing: border-box; color: #c60f0f; text-decoration: none; visibility: hidden; font-size: 0.8em; padding: 0px 4px;"></a></h3><p style="box-sizing: border-box; margin: 0px 0px 24px; padding: 0px;">To expire documents at a specific clock time, begin by creating a TTL index on a field that holds values of BSON date type or an array of BSON date-typed objects&nbsp;<em style="box-sizing: border-box;">and</em>&nbsp;specify an&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>&nbsp;value of<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">0</tt>. For each document in the collection, set the indexed date field to a value corresponding to the time the document should expire. If the indexed date field contains a date in the past, MongoDB considers the document expired.</p><p style="box-sizing: border-box; margin: 24px 0px;">For example, the following operation creates an index on the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">log_events</tt>&nbsp;collection&#8217;s&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAt</tt>&nbsp;field and specifies the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>&nbsp;value of&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">0</tt>:</p><div style="box-sizing: border-box;"><div style="box-sizing: border-box; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><pre style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: 14px; padding: 24px 12px; margin-top: 24px; margin-bottom: 24px; word-break: break-all; word-wrap: normal; color: #222222; border-left-width: 5px; border-style: none none none solid; border-left-color: #494747; border-radius: 0px; overflow: auto; background: url(&quot;https://media.mongodb.org/code-block-bg.png&quot;) 0px 0px repeat #f5f6f7;"><span style="box-sizing: border-box;">db</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">log_events</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">createIndex</span><span style="box-sizing: border-box;">(</span> <span style="box-sizing: border-box;">{</span> <span style="box-sizing: border-box; color: #4070a0;">"expireAt"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #208050;">1</span> <span style="box-sizing: border-box;">},</span> <span style="box-sizing: border-box;">{</span> <span style="box-sizing: border-box;">expireAfterSeconds</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #208050;">0</span> <span style="box-sizing: border-box;">}</span> <span style="box-sizing: border-box;">)</span> </pre></div></div><p style="box-sizing: border-box; margin: 24px 0px;">For each document, set the value of&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAt</tt>&nbsp;to correspond to the time the document should expire. For instance, the following&nbsp;<a internal"="" href="https://docs.mongodb.org/manual/reference/method/db.collection.insert/#db.collection.insert" title="db.collection.insert()" style="box-sizing: border-box; color: #006cbc; text-decoration: none;"><tt mongodb="" mongodb-method="" docutils=""  literal"="" style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; background-color: transparent;">insert()</tt></a>&nbsp;operation adds a document that should expire at&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;"><span style="box-sizing: border-box;">July</span>&nbsp;<span style="box-sizing: border-box;">22,</span>&nbsp;<span style="box-sizing: border-box;">2013</span><span style="box-sizing: border-box;">14:00:00</span></tt>.</p><div style="box-sizing: border-box;"><div style="box-sizing: border-box; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><pre style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: 14px; padding: 24px 12px; margin-top: 24px; margin-bottom: 24px; word-break: break-all; word-wrap: normal; color: #222222; border-left-width: 5px; border-style: none none none solid; border-left-color: #494747; border-radius: 0px; overflow: auto; background: url(&quot;https://media.mongodb.org/code-block-bg.png&quot;) 0px 0px repeat #f5f6f7;"><span style="box-sizing: border-box;">db</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">log_events</span><span style="box-sizing: border-box;">.</span><span style="box-sizing: border-box;">insert</span><span style="box-sizing: border-box;">(</span> <span style="box-sizing: border-box;">{</span>    <span style="box-sizing: border-box; color: #4070a0;">"expireAt"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #007020; font-weight: bold;">new</span> <span style="box-sizing: border-box; color: #007020;">Date</span><span style="box-sizing: border-box;">(</span><span style="box-sizing: border-box; color: #4070a0;">'July 22, 2013 14:00:00'</span><span style="box-sizing: border-box;">),</span>    <span style="box-sizing: border-box; color: #4070a0;">"logEvent"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #208050;">2</span><span style="box-sizing: border-box;">,</span>    <span style="box-sizing: border-box; color: #4070a0;">"logMessage"</span><span style="box-sizing: border-box; color: #666666;">:</span> <span style="box-sizing: border-box; color: #4070a0;">"Success!"</span> <span style="box-sizing: border-box;">}</span> <span style="box-sizing: border-box;">)</span> </pre></div></div><p style="box-sizing: border-box; margin: 24px 0px;">MongoDB will automatically delete documents from the&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">log_events</tt>&nbsp;collection when the documents&#8217;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAt</tt>&nbsp;value is older than the number of seconds specified in&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAfterSeconds</tt>, i.e.&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">0</tt>&nbsp;seconds older in this case. As such, the data expires at the specified&nbsp;<tt literal"="" style="box-sizing: border-box; color: #000000; font-family: 'Source Code Pro', monospace;">expireAt</tt>&nbsp;value.</p></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/428617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-11 15:03 <a href="http://www.blogjava.net/paulwong/archive/2015/12/11/428617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to delete large amount of data of a MongoDB collection “quickly”</title><link>http://www.blogjava.net/paulwong/archive/2015/12/10/428601.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 10 Dec 2015 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/10/428601.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428601.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/10/428601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428601.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 20px; padding: 0px; color: #626566; font-family: Georgia, serif; font-size: 13px; line-height: 20.8px; background-color: #ffffff;">We have a db collection&nbsp;that is around 30 million documents, and I need&nbsp;to trim it down, to only keeping the documents created on the last month.&nbsp;</p><p style="margin: 0px 0px 20px; padding: 0px; color: #626566; font-family: Georgia, serif; font-size: 13px; line-height: 20.8px; background-color: #ffffff;">One approach would be use the&nbsp;<code style="font-family: Monaco, Consolas, 'Courier New', monospace;">remove</code>&nbsp;command with a condition on the&nbsp;<code style="font-family: Monaco, Consolas, 'Courier New', monospace;">created_at</code>&nbsp;field (the collection already have an index on this field):</p><pre js"="" style="margin-top: 10px; margin-bottom: 10px; padding: 10px; font-family: Monaco, Consolas, 'Courier New', monospace; text-shadow: #ffffff 0px 1px; overflow: auto; color: #626566; font-size: 13px; line-height: 20.8px; background: #eeeeee;">db.my_collection.remove({created_at: {$lte:&nbsp;new Date("11/01/2012")}});</pre><p style="margin: 0px 0px 20px; padding: 0px; color: #626566; font-family: Georgia, serif; font-size: 13px; line-height: 20.8px; background-color: #ffffff;">But this approach will be very slow, instead of that, a better way to do it is rename the current collection (for instance to &#8220;old_collection&#8221;) using&nbsp;<code style="font-family: Monaco, Consolas, 'Courier New', monospace;">renameCollection</code>. Then performing a query-and-insert from the &#8220;old_collection&#8221; into &#8220;my_collection&#8221;:</p><pre js"="" style="margin-top: 10px; margin-bottom: 10px; padding: 10px; font-family: Monaco, Consolas, 'Courier New', monospace; text-shadow: #ffffff 0px 1px; overflow: auto; color: #626566; font-size: 13px; line-height: 20.8px; background: #eeeeee;">db.my_collection.renameCollection("old_collection");  <br />db.createCollection("my_collection");  <br />db.my_collection.createIndex(...); // recreate the indexes for the collection  <br />// copy docs from old collection into the new collection <br />db.old_collection.find(     <br />{created_at: {$gte: new Date("11/01/2012")}}   ).sort({_id: -1}).forEach(     <br />function(row) { db.my_collection.insert(row); }   );  // drop old collection db.old_collection.drop();  </pre><p style="margin: 0px 0px 20px; padding: 0px; color: #626566; font-family: Georgia, serif; font-size: 13px; line-height: 20.8px; background-color: #ffffff;">This approach&nbsp;is typically faster than running a bunch of removes on your data</p><img src ="http://www.blogjava.net/paulwong/aggbug/428601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-10 20:09 <a href="http://www.blogjava.net/paulwong/archive/2015/12/10/428601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB 固定集合(Capped Collections)</title><link>http://www.blogjava.net/paulwong/archive/2015/12/09/428576.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 09 Dec 2015 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/09/428576.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428576.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/09/428576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428576.html</trackback:ping><description><![CDATA[<p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">MongoDB 固定集合（Capped Collections）是性能出色且有着固定大小的集合，对于大小固定，我们可以想象其就像一个环形队列，当集合空间用完后，再插入的元素就会覆盖最初始的头部的元素！</p><hr style="font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px; line-height: 27.136px;" /><h2>创建固定集合</h2><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">我们通过createCollection来创建一个固定集合，且capped选项设置为true：</p><pre prettyprinted"="" style="padding: 3px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; overflow: auto; width: auto; font-size: 0.8em; line-height: 1.5em; border-radius: 5px; background-color: #e1e1e1;"><code style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; max-height: 600px; display: block; overflow: auto; background-color: #f7f7f7;">&gt;db.createCollection(<span style="color: #800000;">"cappedLogCollection"</span>,{capped:<span style="color: #00008b;">true</span>,size:<span style="color: #800000;">10000</span>})</code></pre><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">还可以指定文档个数,加上max:1000属性：</p><pre prettyprinted"="" style="padding: 3px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; overflow: auto; width: auto; font-size: 0.8em; line-height: 1.5em; border-radius: 5px; background-color: #e1e1e1;"><code style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; max-height: 600px; display: block; overflow: auto; background-color: #f7f7f7;">&gt;db.createCollection(<span style="color: #800000;">"cappedLogCollection"</span>,{capped:<span style="color: #00008b;">true</span>,size:<span style="color: #800000;">10000</span>,max:<span style="color: #800000;">1000</span>})</code></pre><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">判断集合是否为固定集合:</p><pre prettyprinted"="" style="padding: 3px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; overflow: auto; width: auto; font-size: 0.8em; line-height: 1.5em; border-radius: 5px; background-color: #e1e1e1;"><code style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; max-height: 600px; display: block; overflow: auto; background-color: #f7f7f7;">&gt;db.cappedLogCollection.isCapped()</code></pre><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">如果需要将已存在的集合转换为固定集合可以使用以下命令：</p><pre prettyprinted"="" style="padding: 3px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; overflow: auto; width: auto; font-size: 0.8em; line-height: 1.5em; border-radius: 5px; background-color: #e1e1e1;"><code style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; max-height: 600px; display: block; overflow: auto; background-color: #f7f7f7;">&gt;db.runCommand({<span style="color: #800000;">"convertToCapped"</span>:<span style="color: #800000;">"posts"</span>,size:<span style="color: #800000;">10000</span>})</code></pre><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">以上代码将我们已存在的 posts 集合转换为固定集合。</p><hr style="font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px; line-height: 27.136px;" /><h2>固定集合查询</h2><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">固定集合文档按照插入顺序储存的,默认情况下查询就是按照插入顺序返回的,也可以使用$natural调整返回顺序。</p><pre prettyprinted"="" style="padding: 3px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; overflow: auto; width: auto; font-size: 0.8em; line-height: 1.5em; border-radius: 5px; background-color: #e1e1e1;"><code style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; max-height: 600px; display: block; overflow: auto; background-color: #f7f7f7;">&gt;db.cappedLogCollection.find().sort({$natural:-<span style="color: #800000;">1</span>})</code></pre><hr style="font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px; line-height: 27.136px;" /><h2>固定集合的功能特点</h2><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">可以插入及更新,但更新不能超出collection的大小,否则更新失败,不允许删除,但是可以调用drop()删除集合中的所有行,但是drop后需要显式地重建集合。</p><p style="line-height: 27.136px; margin: 1em 0px; font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px;">在32位机子上一个cappped collection的最大值约为482.5M,64位上只受系统文件大小的限制。</p><hr style="font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px; line-height: 27.136px;" /><h2>固定集合属性及用法</h2><h3>属性</h3><ul style="font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px; line-height: 27.136px;"><li>属性1:对固定集合进行插入速度极快</li><li>属性2:按照插入顺序的查询输出速度极快</li><li>属性3:能够在插入最新数据时,淘汰最早的数据</li></ul><h3>用法</h3><ul style="font-family: 'Helvetica Neue', Helvetica, STHeiTi, 'Microsoft YaHei'; font-size: 16.96px; line-height: 27.136px;"><li>用法1:储存日志信息</li><li>用法2:缓存一些少量的文档</li></ul><img src ="http://www.blogjava.net/paulwong/aggbug/428576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-09 14:41 <a href="http://www.blogjava.net/paulwong/archive/2015/12/09/428576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB 聚合</title><link>http://www.blogjava.net/paulwong/archive/2015/12/08/428558.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 08 Dec 2015 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/08/428558.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428558.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/08/428558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428558.html</trackback:ping><description><![CDATA[<p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;"><a href="http://www.runoob.com/mongodb/mongodb-aggregate.html" target="_blank">http://www.runoob.com/mongodb/mongodb-aggregate.html</a><br />MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等)，并返回计算后的数据结果。有点类似sql语句中的 count(*)。</p><hr style="color: #d4d4d4; height: 1px; border: 0px; clear: both; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, STHeiti, 'Microsoft Yahei', sans-serif; font-size: 12px; line-height: normal; background-color: #d4d4d4;" /><h2>aggregate() 方法</h2><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">MongoDB中聚合的方法使用aggregate()。</p><h3>语法</h3><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">aggregate() 方法的基本语法格式如下所示：</p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">&gt;</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">db</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">COLLECTION_NAME</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">aggregate</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">AGGREGATE_OPERATION</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span></pre><h3>实例</h3><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">集合中的数据如下：</p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    _id</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">ObjectId</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">7df78ad8902c</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    title</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'MongoDB Overview'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">     description</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'MongoDB is no sql database'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    by_user</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'w3cschool.cc'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    url</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'http://www.w3cschool.cc'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    tags</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">[</span><span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'mongodb'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'database'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'NoSQL'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">],</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    likes</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">100</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">},</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    _id</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">ObjectId</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">7df78ad8902d</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    title</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'NoSQL Overview'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">     description</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'No sql database is very fast'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    by_user</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'w3cschool.cc'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    url</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'http://www.w3cschool.cc'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    tags</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">[</span><span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'mongodb'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'database'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'NoSQL'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">],</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    likes</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">10</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">},</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    _id</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">ObjectId</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">7df78ad8902e</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    title</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'Neo4j Overview'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">     description</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'Neo4j is no sql database'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    by_user</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'Neo4j'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    url</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'http://www.neo4j.com'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    tags</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">[</span><span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'neo4j'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'database'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">'NoSQL'</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">],</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">    likes</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">750</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">},</span></pre><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">现在我们通过以上集合计算每个作者所写的文章数，使用aggregate()计算结果如下：</p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">&gt;</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> db</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">mycol</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">aggregate</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">([{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">$group </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">_id </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"$by_user"</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> num_tutorial </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">$sum </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}}}])</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"result"</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">[</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"_id"</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"w3cschool.cc"</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"num_tutorial"</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">2</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">},</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"_id"</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"Neo4j"</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"num_tutorial"</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">],</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"ok"</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">&gt;</span></pre><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">以上实例类似sql语句：<em style="border: 0px; margin: 0px; padding: 0px;">&nbsp;select by_user, count(*) from mycol group by by_user</em></p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">在上面的例子中，我们通过字段by_user字段对数据进行分组，并计算by_user字段相同值的总和。</p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">下表展示了一些聚合的表达式:</p><table style="border: 0px; margin: 4px 0px; padding: 0px; border-collapse: collapse; width: 729px; color: #333333; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, STHeiti, 'Microsoft Yahei', sans-serif; font-size: 12px; background-color: #ffffff;"><tbody style="border: 0px; margin: 0px; padding: 0px;"><tr style="border: 0px; margin: 0px; padding: 0px; background-color: #f6f4f0;"><th style="border: 1px solid #555555; margin: 0px; padding: 3px; color: #ffffff; vertical-align: top; width: 65px; background-color: #555555;">表达式</th><th style="border: 1px solid #555555; margin: 0px; padding: 3px; color: #ffffff; vertical-align: top; width: 357px; background-color: #555555;">描述</th><th style="border: 1px solid #555555; margin: 0px; padding: 3px; color: #ffffff; vertical-align: top; background-color: #555555;">实例</th></tr><tr style="border: 0px; margin: 0px; padding: 0px;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$sum</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">计算总和。</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px; background-color: #f6f4f0;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$avg</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">计算平均值</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$min</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">获取集合中所有文档对应值得最小值。</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px; background-color: #f6f4f0;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$max</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">获取集合中所有文档对应值得最大值。</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$push</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">在结果文档中插入值到一个数组中。</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px; background-color: #f6f4f0;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$addToSet</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">在结果文档中插入值到一个数组中，但不创建副本。</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$first</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">根据资源文档的排序获取第一个文档数据。</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])</td></tr><tr style="border: 0px; margin: 0px; padding: 0px; background-color: #f6f4f0;"><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">$last</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">根据资源文档的排序获取最后一个文档数据</td><td style="border-style: solid; border-color: #d4d4d4; margin: 0px; padding: 7px 5px; font-size: 1em; vertical-align: top;">db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])</td></tr></tbody></table><hr style="color: #d4d4d4; height: 1px; border: 0px; clear: both; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, STHeiti, 'Microsoft Yahei', sans-serif; font-size: 12px; line-height: normal; background-color: #d4d4d4;" /><h2>管道的概念</h2><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。</p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。</p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">表达式：处理输入文档并输出。表达式是无状态的，只能用于计算当前聚合管道的文档，不能处理其它的文档。</p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">这里我们介绍一下聚合框架中常用的几个操作：</p><ul style="border: 0px; margin: 1em 0px; padding: 0px; line-height: 16.8px; list-style-type: none; color: #333333; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, STHeiti, 'Microsoft Yahei', sans-serif; font-size: 12px; background-color: #ffffff;"><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$project：修改输入文档的结构。可以用来重命名、增加或删除域，也可以用于创建计算结果以及嵌套文档。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$match：用于过滤数据，只输出符合条件的文档。$match使用MongoDB的标准查询操作。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$limit：用来限制MongoDB聚合管道返回的文档数。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$skip：在聚合管道中跳过指定数量的文档，并返回余下的文档。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$unwind：将文档中的某一个数组类型字段拆分成多条，每条包含数组中的一个值。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$group：将集合中的文档分组，可用于统计结果。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$sort：将输入文档排序后输出。</li><li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.5em; line-height: 1.5em; font-size: 1em; background-image: url(http://www.runoob.com/wp-content/themes/runoob/assets/img/bullet.png); background-position: 0% 0.5em; background-repeat: no-repeat;">$geoNear：输出接近某一地理位置的有序文档。</li></ul><h3>管道操作符实例</h3><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">1、$project实例</p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;"></p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">db</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">article</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">aggregate</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $project </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">         title </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">         author </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">);</span></pre><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">这样的话结果中就只还有_id,tilte和author三个字段了，默认情况下_id字段是被包含的，如果要想不包含_id话可以这样:</p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">db</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">article</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">aggregate</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $project </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">         _id </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">0</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">         title </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">         author </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}});</span></pre><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">2.$match实例</p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">db</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">articles</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">aggregate</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">[</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $match </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> score </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $gt </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">70</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $lte </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">90</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">},</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $group</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> _id</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #000088;">null</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">,</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> count</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $sum</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">1</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">]</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">);</span></pre><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">$match用于获取分数大于70小于或等于90记录，然后将符合条件的记录送到下一阶段$group管道操作符进行处理。</p><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">3.$skip实例</p><pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; word-break: break-all; word-wrap: break-word; color: #333333; background: url(http://www.runoob.com/images/codecolorer_bg.gif) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">db</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">article</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">aggregate</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> $skip </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">5</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">});</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span></pre><p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 12px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">经过$skip管道操作符处理后，前五个文档被"过滤"掉。</p><img src ="http://www.blogjava.net/paulwong/aggbug/428558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-08 10:44 <a href="http://www.blogjava.net/paulwong/archive/2015/12/08/428558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb运维之副本集实践</title><link>http://www.blogjava.net/paulwong/archive/2015/06/30/425955.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 30 Jun 2015 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/06/30/425955.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/425955.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/06/30/425955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/425955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/425955.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 正式环境，4台机器+一台定时任务的机器。 服务器是阿里云的ECS， 负载均衡用的是阿里云的SLB， mysql用阿里云的RDS， 缓存用阿里云的OCS， 运维基本上是都不需要担心了， 现在的云服务已经非常完善了， 其实我们用阿里云的服务非常多， 大概有20多个类型的服务， 感谢阿里云。 而我的技术栈是nodejs + mongodb，而阿里云有k-v兼容redis协议的nosql，无mongodb...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/06/30/425955.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/425955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-06-30 10:30 <a href="http://www.blogjava.net/paulwong/archive/2015/06/30/425955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB优化资源</title><link>http://www.blogjava.net/paulwong/archive/2015/05/05/424867.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 05 May 2015 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/05/05/424867.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/424867.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/05/05/424867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/424867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/424867.html</trackback:ping><description><![CDATA[把MongoDB当成纯内存数据库使用<br /><a href="http://database.51cto.com/art/201309/411076.htm" target="_blank">http://database.51cto.com/art/201309/411076.htm</a><br /><br />Do you want a timeout?<br /><a href="http://blog.mongolab.com/2013/10/do-you-want-a-timeout/" target="_blank">http://blog.mongolab.com/2013/10/do-you-want-a-timeout/</a><br /><br /><br />MongoDB 查询超时异常的原因及解决办法<br /><a href="http://database.51cto.com/art/201503/467581.htm" target="_blank">http://database.51cto.com/art/201503/467581.htm</a><br /><br /><br />Mongo连接池操作MongoOptions<br /><a href="http://dawn-sky.iteye.com/blog/1343659" target="_blank">http://dawn-sky.iteye.com/blog/1343659</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/424867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-05-05 17:32 <a href="http://www.blogjava.net/paulwong/archive/2015/05/05/424867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MONGODB常用命令</title><link>http://www.blogjava.net/paulwong/archive/2015/04/15/424445.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 15 Apr 2015 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/04/15/424445.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/424445.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/04/15/424445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/424445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/424445.html</trackback:ping><description><![CDATA[<div>
<div><span style="color: red;">启动：</span><br />
mongod --config /usr/local/mongodb/conf/cms.conf</div>
<div><br /><span style="color: #ff0000;">关闭：</span><br /><div>ps -ef | grep mongo (查PID)<br />kill -15 pid</div><br /><span style="color: #ff0000;">修复：</span><br /><div>rm /data/mongodb/mongod.lock</div><div>mongod --dbpath /data/mongodb --repair</div><div>mongod --config /usr/local/mongodb/conf/cms.conf</div><br />
<span style="color: red;">进入命令模式：</span></div>
<div>mongo admin -u root -p cloudDB</div>
<div><br /><strong>
</strong><span style="color: red;">查看服务器连接数：</span></div>
<div>db.serverStatus().connections</div>
<div><br />
<span style="color: red;">查看版本：</span></div>
<div>db.runCommand({"buildInfo":1}) &nbsp;</div>
<div><br />
<span style="color: red;">查看统计：</span></div>
<div>mongostat -u root -p cloudDB</div>
<div><br />
<span style="color: red;">备份数据：</span></div>
<div>mongodump -u&nbsp;cms&nbsp;-p&nbsp;cms&nbsp;-d cms -o /data/dump/cms</div>
<div><br />
<span style="color: red;">恢复数据：</span></div>
<div>mongorestore -u cms -p cms -d cms /data/dump/cms</div>
</div><img src ="http://www.blogjava.net/paulwong/aggbug/424445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-04-15 17:39 <a href="http://www.blogjava.net/paulwong/archive/2015/04/15/424445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几大NOSQL数据库性能比较</title><link>http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 29 Jan 2015 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422565.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422565.html</trackback:ping><description><![CDATA[Apache Cassandra NoSQL Performance Benchmarks<br /><a href="http://planetcassandra.org/nosql-performance-benchmarks" target="_blank">http://planetcassandra.org/nosql-performance-benchmarks</a><br /><br />NoSQL Benchmarking<br /><a href="http://www.cubrid.org/blog/dev-platform/nosql-benchmarking/" target="_blank">http://www.cubrid.org/blog/dev-platform/nosql-benchmarking/</a><br /><br /><br /><a href="http://www.badrit.com/blog/2013/11/18/redis-vs-mongodb-performance#.VMpfW2SUfsg" target="_blank">http://www.badrit.com/blog/2013/11/18/redis-vs-mongodb-performance#.VMpfW2SUfsg</a><br /><br />How many requests per second can I get out of Redis?<br /><a href="http://skipperkongen.dk/2013/08/27/how-many-requests-per-second-can-i-get-out-of-redis/" target="_blank">http://skipperkongen.dk/2013/08/27/how-many-requests-per-second-can-i-get-out-of-redis/</a><br /><br />redis性能测试，测试并发性能<br /><a href="http://my.oschina.net/pblack/blog/102394" target="_blank">http://my.oschina.net/pblack/blog/102394</a><img src ="http://www.blogjava.net/paulwong/aggbug/422565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-30 00:16 <a href="http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mongodb 查询性能的事情</title><link>http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 06 Jan 2015 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422096.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422096.html</trackback:ping><description><![CDATA[上一篇：Mongodb VS Mysql 查询性能，测试了 mongodb 与 mysql 的查询性能。结果说明 mongodb 性能可以， 可以代替 mysql 来使用。<br /><br />但是这个测试都是在百万级别，我的场景在 KW 级别。所以还要对 mongodb 在 kw 级别下测试效果。<br /><br />我测试环境是 4G 内存（有好些内存被其它程序占用），2kw 数据，查询随机生成 id（一次查询 20 个id）。<br /><br />在这样的环境中测试不理想，比较失望。平均一次查询 500ms（比 mysql 还差，特别是在并发查询下，性能较差。很底的吞吐量）。查看其索引大小（用 db.mycoll.stats() 可以查询）：2kw 数据中有 1.1G 左右的索引，存储的数据在 11G 左右。<br /><br />测试过程中发现 iowait 占 50% 左右，看来还是 io 的瓶颈。还看到 mongodb 使用的内存不多（小于索引的大小，看来这机器不足够来测试）。<br /><br />换了个有可用 6G 内存的机器。在 50 个并发下，可以达到平均 100 ms 左右，算比较满意，但是并发好像能力不够强。但这个性能不能由我控制，还由机器的可用内存控制。原因就是 mongodb 没有指定可占用的内存大小，它把所有空闲内存当缓存使用，既是优点也是缺点：优点--可以最大限度提升性能；缺点--容易受其它程序干扰（占用了它的缓存）。由我测试来看，它抢占内存的能力不强。mongodb 是用内存映射文件 vmm，官方的说明：<br /><br />Memory Mapped Storage Engine<br /><br />This is the current storage engine for MongoDB, and it uses memory-mapped files for all disk I/O.  Using this strategy, the operating system's virtual memory manager is in charge of caching.  This has several implications:<br /><br />There is no redundancy between file system cache and database cache: they are one and the same.<br />MongoDB can use all free memory on the server for cache space automatically without any configuration of a cache size.<br />Virtual memory size and resident size will appear to be very large for the mongod process.  This is benign: virtual memory space will be just larger than the size of the datafiles open and mapped; resident size will vary depending on the amount of memory not used by other processes on the machine.<br />Caching behavior (such as LRU'ing out of pages, and laziness of page writes) is controlled by the operating system: quality of the VMM implementation will vary by OS.<br />所以这么来看，我觉得 mongodb 没有指定内存大小来保证正常的缓存是个缺点。应该至少保证索引全部能放到内存中。但这个行为不是由启动程序决定，而是由环境决定（美中不足）。<br /><br />官方也有段内容说到索引放到内存中：<br /><br />If your queries seem sluggish, you should verify that your indexes are small enough to fit in RAM. For instance, if you're running on 4GB RAM and you have 3GB of indexes, then your indexes probably aren't fitting in RAM. You may need to add RAM and/or verify that all the indexes you've created are actually being used.<br /><br />还是希望 mongodb 中可以指定内存大小，确保它有足够内存加载索引。<br /><br />小结：大数据量下（kw级）mongodb 并发查询不够理想（100-200/s）。写数据很快（我的环境，远程提交近 1w/s，估计达到 1.5W/s 是没问题的，基本不受大数据量的影响）。<br /><br />贴个测试数据：<br /><br />1 id(内存使用 &lt;1.5g)	10 id(内存使用 2-3g)	20 id(内存使用 &gt;4g)<br />1	2	3	1	2	3	1	2	3<br />total time	17.136	25.508	17.387	37.138	33.788	25.143	44.75	31.167	30.678<br />1 thread thruput	583.5668	392.0339	575.1423	269.266	295.9631	397.725	223.4637	320.8522	325.9665<br />total time	24.405	22.664	24.115	41.454	41.889	39.749	56.138	53.713	54.666<br />5 thread thruput	2048.76	2206.142	2073.398	1206.156	1193.631	1257.893	890.6623	930.8733	914.6453<br />total time	27.567	26.867	28.349	55.672	54.347	50.93	72.978	81.857	75.925<br />10 thread thruput	3627.526	3722.038	3527.461	1796.235	1840.028	1963.479	1370.276	1221.643	1317.089<br />total time	51.397	57.446	53.81	119.386	118.015	76.405	188.962	188.034	138.839<br />20 thread thruput	3891.278	3481.53	3716.781	1675.238	1694.7	2617.63	1058.414	1063.637	1440.517<br />total time	160.038	160.808	160.346	343.559	352.732	460.678	610.907	609.986	1411.306<br />50 thread thruput	3124.258	3109.298	3118.257	1455.354	1417.507	1085.357	818.4552	819.6909	354.2818<br />total time	2165.408	635.887	592.958	1090.264	1034.057	1060.266	1432.296	1466.971	1475.061<br />100 thread thruput	461.8067	1572.606	1686.46	917.209	967.0647	943.1595	698.1797	681.6767	677.9381<br />上面的测试分别用三种查询（每次 1,10,20 id），在不同并发下测试3次，每次发出 1w 次查询。第一行数据为所有线程累加时间（单位 ms），第二行数据为吞吐量(1w /(total time / thread num))。测试中内存使用慢慢增加，所以后面的数据可能比较高效的（高效的环境）。<br /><br />从上表看，10 - 20线程比较高的吞吐量。看到内存使用，前提就是索引加载到内存中，并有些内存作为缓存。<br /><br />下面有个索引查询优化的 pdf。<br /><br />Indexing and Query Optimizer<br /><br />Indexing and Query Optimizer (Aaron Staple)<br />ps:<br /><br />默认 mongodb 服务器只有10个并发，如果要提高它的连接数，可以用 --maxConns num 来提高它的接收并发的数据。<br /><br />mongodb 的 java 驱动默认最多只有 10 并发连接池。要提高它，可以在 mongo.jar 的环境中加入 MONGO.POOLSIZE 系统参数，如 java -DMONGO.POOLSIZE=50 ...<img src ="http://www.blogjava.net/paulwong/aggbug/422096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-06 23:39 <a href="http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MongoDB最大连接数的查看与修改</title><link>http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 06 Jan 2015 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422093.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422093.html</trackback:ping><description><![CDATA[在Linux平台下，无论是64位或者32位的MongoDB默认最大连接数都是819，WIN平台不知道，估计也没有人在 WIN平台下使用MongoDB做生产环境<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">root@DELL113&nbsp;mongodb-linux-i686-2.4.1</span><span style="color: #800000; font-weight: bold;">]</span>#&nbsp;mongo admin -u root -p password<br />MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/admin<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;"current"&nbsp;:&nbsp;1,&nbsp;"available"&nbsp;:&nbsp;818,&nbsp;"totalCreated"&nbsp;:&nbsp;NumberLong(1)&nbsp;}</div><br />途中available显示818少了一个，表示空闲的。current表示已经占用了的连接数，两数一加就等于819，如果我现在在连接一个，那么available就是817，current就是2<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[root@DELL113&nbsp;mongodb-linux-i686-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongo&nbsp;192.168.6.42</span><span style="color: #008000; "><br /></span>MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/test<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;818,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(1)&nbsp;}<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;2,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;817,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(2)&nbsp;}</div><br />819个连接数对于一般的站点我认为已经够用，并且都是现连现取现断。但这个连接数也可以修改，只要在启动的时候加入--maxConns即可<br />服务器启动<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[root@lee&nbsp;mongodb-linux-x86_64-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongod&nbsp;--dbpath=/root/db&nbsp;--maxConns=2000</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.905&nbsp;[initandlisten]&nbsp;MongoDB&nbsp;starting&nbsp;:&nbsp;pid=2812&nbsp;port=27017&nbsp;dbpath=/root/db&nbsp;64-bit&nbsp;host=lee<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;db&nbsp;version&nbsp;v2.4.1<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;git&nbsp;version:&nbsp;1560959e9ce11a693be8b4d0d160d633eee75110<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;build&nbsp;info:&nbsp;Linux&nbsp;ip-10-2-29-40&nbsp;2.6.21.7-2.ec2.v1.2.fc8xen&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;SMP&nbsp;Fri&nbsp;Nov&nbsp;20&nbsp;17:48:28&nbsp;EST&nbsp;2009&nbsp;x86_64&nbsp;BOOST_LIB_VERSION=1_49</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;allocator:&nbsp;tcmalloc<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;options:&nbsp;{&nbsp;dbpath:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">/root/db</span><span style="color: #800000; ">"</span>,&nbsp;maxConns:&nbsp;2000&nbsp;}<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.982&nbsp;[initandlisten]&nbsp;journal&nbsp;dir=/root/db/journal<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.982&nbsp;[initandlisten]&nbsp;recover&nbsp;:&nbsp;no&nbsp;journal&nbsp;files&nbsp;present,&nbsp;no&nbsp;recovery&nbsp;needed<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.297&nbsp;[initandlisten]&nbsp;preallocateIsFaster=true&nbsp;2.62<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.717&nbsp;[initandlisten]&nbsp;--maxConns&nbsp;too&nbsp;high,&nbsp;can&nbsp;only&nbsp;handle&nbsp;819<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.724&nbsp;[initandlisten]&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;27017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.725&nbsp;[websvr]&nbsp;admin&nbsp;web&nbsp;console&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;28017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:25.126&nbsp;[initandlisten]&nbsp;connection&nbsp;accepted&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;192.168.4.86:53917&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;(1&nbsp;connection&nbsp;now&nbsp;open)</span></div><br />查询最大连接数<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[root@DELL113&nbsp;mongodb-linux-i686-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongo&nbsp;192.168.6.42</span><span style="color: #008000; "><br /></span>MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/test<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;818,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(1)&nbsp;}<br />&gt;&nbsp;</div><br />发现还是819？其实是Linux默认进程能打开最大文件数有关，可以通过ulimit 解决<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[root@lee&nbsp;mongodb-linux-x86_64-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ulimit&nbsp;-n&nbsp;2500</span><span style="color: #008000; "><br /></span>[root@lee&nbsp;mongodb-linux-x86_64-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongod&nbsp;--dbpath=/root/db&nbsp;--maxConns=2000</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;MongoDB&nbsp;starting&nbsp;:&nbsp;pid=2930&nbsp;port=27017&nbsp;dbpath=/root/db&nbsp;64-bit&nbsp;host=lee<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;db&nbsp;version&nbsp;v2.4.1<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;git&nbsp;version:&nbsp;1560959e9ce11a693be8b4d0d160d633eee75110<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;build&nbsp;info:&nbsp;Linux&nbsp;ip-10-2-29-40&nbsp;2.6.21.7-2.ec2.v1.2.fc8xen&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;SMP&nbsp;Fri&nbsp;Nov&nbsp;20&nbsp;17:48:28&nbsp;EST&nbsp;2009&nbsp;x86_64&nbsp;BOOST_LIB_VERSION=1_49</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;allocator:&nbsp;tcmalloc<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;options:&nbsp;{&nbsp;dbpath:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">/root/db</span><span style="color: #800000; ">"</span>,&nbsp;maxConns:&nbsp;2000&nbsp;}<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.031&nbsp;[initandlisten]&nbsp;journal&nbsp;dir=/root/db/journal<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.031&nbsp;[initandlisten]&nbsp;recover&nbsp;:&nbsp;no&nbsp;journal&nbsp;files&nbsp;present,&nbsp;no&nbsp;recovery&nbsp;needed<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.170&nbsp;[initandlisten]&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;27017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.171&nbsp;[websvr]&nbsp;admin&nbsp;web&nbsp;console&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;28017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:10.076&nbsp;[initandlisten]&nbsp;connection&nbsp;accepted&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;192.168.4.86:53161&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;(1&nbsp;connection&nbsp;now&nbsp;open)</span><span style="color: #008000; "><br /></span></div><br />再查看最大连接数，搞定<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[root@DELL113&nbsp;mongodb-linux-i686-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongo&nbsp;192.168.6.42</span><span style="color: #008000; "><br /></span>MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/test<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1999,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(1)&nbsp;}<br />&gt;&nbsp;</div><br />关于ulimit的更多知识大家可以去网上检索检索<br /><br />客户端程序通常是通过DRIVER来链接，由于每次建立链接的成本都挺高，因此都用链接池来实现，SPRING DATA MONGODB中是如下配置<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->mongo.dbname=cms<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">线程池的大小</span><span style="color: #008000; "><br /></span>mongo.connectionsPerHost=100<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">这个*mongo.connectionsPerHost则是如果链接数大于100的等待xttk数</span><span style="color: #008000; "><br /></span>mongo.threadsAllowedToBlockForConnectionMultiplier=4<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">等待线程的等待时间</span><span style="color: #008000; "><br /></span>mongo.maxWaitTime=1500<br />mongo.socketTimeout=1500<br />mongo.connectTimeout=1000<br />mongo.autoConnectRetry=true<br />mongo.socketKeepAlive=true<br />mongo.slaveOk=true</div><br /><br /><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;"><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">autoConnectRetry</strong>&nbsp;simply means the driver will automatically attempt to reconnect to the server(s) after unexpected disconnects. In production environments you usually want this set to true.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">connectionsPerHost</strong>&nbsp;are the amount of physical connections a single Mongo instance (it's singleton so you usually have one per application) can establish to a mongod/mongos process. At time of writing the java driver will establish this amount of connections eventually even if the actual query throughput is low (in order words you will see the "conn" statistic in mongostat rise until it hits this number per app server).</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">There is no need to set this higher than 100 in most cases but this setting is one of those "test it and see" things. Do note that you will have to make sure you set this low enough so that the total amount of connections to your server do not exceed</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; white-space: pre-wrap; background: #eeeeee;">db.serverStatus().connections.available</code></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">In production we currently have this at 40.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">connectTimeout</strong>. As the name suggest number of milliseconds the driver will wait before a connection attempt is aborted. Set timeout to something long (15-30 seconds) unless there's a realistic, expected chance this will be in the way of otherwise succesful connection attempts. Normally if a connection attempt takes longer than a couple of seconds your network infrastructure isn't capable of high throughput.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">maxWaitTime</strong>. Number of ms a thread will wait for a connection to become available on the connection pool, and raises an exception if this does not happen in time. Keep default.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">socketTimeout</strong>. Standard socket timeout value. Set to 60 seconds (60000).</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">threadsAllowedToBlockForConnectionMultiplier</strong>. Multiplier for connectionsPerHost that denotes the number of threads that are allowed to wait for connections to become available if the pool is currently exhausted. This is the setting that will cause the "com.mongodb.DBPortPool$SemaphoresOut: Out of semaphores to get db connection" exception. It will throw this exception once this thread queue exceeds the threadsAllowedToBlockForConnectionMultiplier value. For example, if the connectionsPerHost is 10 and this value is 5 up to 50 threads can block before the aforementioned exception is thrown.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">If you expect big peaks in throughput that could cause large queues temporarily increase this value. We have it at 1500 at the moment for exactly that reason. If your query load consistently outpaces the server you should just improve your hardware/scaling situation accordingly.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">readPreference</strong>.&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">(UPDATED, 2.8+)</strong>&nbsp;Used to determine the default read preference and replaces "slaveOk". Set up a ReadPreference through one of the class factory method.&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">A full description of the most common settings can be found at the end of this post</em></strong></p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">w</strong>.&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">(UPDATED, 2.6+)</strong>&nbsp;This value determines the "safety" of the write. When this value is -1 the write will not report any errors regardless of network or database errors. WriteConcern.NONE is the appropriate predefined WriteConcern for this. If w is 0 then network errors will make the write fail but mongo errors will not. This is typically referred to as "fire and forget" writes and should be used when performance is more important than consistency and durability. Use WriteConcern.NORMAL for this mode.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">If you set w to 1 or higher the write is considered safe. Safe writes perform the write and follow it up by a request to the server to make sure the write succeeded or retrieve an error value if it did not (in other words, it sends a getLastError() command after you write). Note that until this getLastError() command is completed the connection is reserved. As a result of that and the additional command the throughput will be signficantly lower than writes with w &lt;= 0. With a w value of exactly 1 MongoDB guarantees the write succeeded (or verifiably failed) on the instance you sent the write to.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">In the case of replica sets you can use higher values for w whcih tell MongoDB to send the write to at least "w" members of the replica set before returning (or more accurately, wait for the replication of your write to "w" members). You can also set w to the string "majority" which tells MongoDB to perform the write to the majority of replica set members (WriteConcern.MAJORITY). Typicall you should set this to 1 unless you need raw performance (-1 or 0) or replicated writes (&gt;1). Values higher than 1 have a considerable impact on write throughput.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">fsync</strong>. Durability option that forces mongo to flush to disk after each write when enabled. I've never had any durability issues related to a write backlog so we have this on false (the default) in production.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">j</strong>&nbsp;*<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">(NEW 2.7+)</em>*. Boolean that when set to true forces MongoDB to wait for a successful journaling group commit before returning. If you have journaling enabled you can enable this for additional durability. Refer to&nbsp;<a href="http://www.mongodb.org/display/DOCS/Journaling" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: #4a6b82; text-decoration: none; cursor: pointer; background: transparent;">http://www.mongodb.org/display/DOCS/Journaling</a>&nbsp;to see what journaling gets you (and thus why you might want to enable this flag).</p></li></ul><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference</strong>&nbsp;The ReadPreference class allows you to configure to what mongod instances queries are routed if you are working with replica sets. The following options are available :</p><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;"><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.primary()</strong>&nbsp;: All reads go to the repset primary member only. Use this if you require all queries to return consistent (the most recently written) data. This is the default.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.primaryPreferred()</strong>&nbsp;: All reads go to the repset primary member if possible but may query secondary members if the primary node is not available. As such if the primary becomes unavailable reads become eventually consistent, but only if the primary is unavailable.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.secondary()</strong>&nbsp;: All reads go to secondary repset members and the primary member is used for writes only. Use this only if you can live with eventually consistent reads. Additional repset members can be used to scale up read performance although there are limits to the amount of (voting) members a repset can have.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.secondaryPreferred()</strong>&nbsp;: All reads go to secondary repset members if any of them are available. The primary member is used exclusively for writes unless all secondary members become unavailable. Other than the fallback to the primary member for reads this is the same as ReadPreference.secondary().</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.nearest()</strong>&nbsp;: Reads go to the nearest repset member available to the database client. Use only if eventually consistent reads are acceptable. The nearest member is the member with the lowest latency between the client and the various repset members. Since busy members will eventually have higher latencies this&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">should</em>&nbsp;also automatically balance read load although in my experience secondary(Preferred) seems to do so better if member latencies are relatively consistent.</p></li></ul><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;">Note : All of the above have tag enabled versions of the same method which return TaggableReadPreference instances instead. A full description of replica set tags can be found here :<a href="http://docs.mongodb.org/manual/reference/replica-configuration/#tag-sets" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: #4a6b82; text-decoration: none; cursor: pointer; background: transparent;">Replica Set Tags</a></p><br /><br />参考网址：<br /><a href="http://api.mongodb.org/java/2.10.1/com/mongodb/MongoClientOptions.Builder.html#connectionsPerHost(int)" target="_blank">http://api.mongodb.org/java/2.10.1/com/mongodb/MongoClientOptions.Builder.html#connectionsPerHost(int)</a><br /><a href="https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.5.xsd" target="_blank">https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.5.xsd</a><img src ="http://www.blogjava.net/paulwong/aggbug/422093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-06 22:10 <a href="http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Architecture for Redis cache &amp; Mongo for persistence</title><link>http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 04 Jan 2015 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422026.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422026.html</trackback:ping><description><![CDATA[Caching with Spring Data Redis<br /><a href="http://www.javacodegeeks.com/2013/02/caching-with-spring-data-redis.html" target="_blank">http://www.javacodegeeks.com/2013/02/caching-with-spring-data-redis.html</a><br /><br />Architecture for Redis cache &amp; Mongo for persistence<br /><a href="http://stackoverflow.com/questions/11218941/architecture-for-redis-cache-mongo-for-persistence" target="_blank">http://stackoverflow.com/questions/11218941/architecture-for-redis-cache-mongo-for-persistence</a><br /><br />MongoDB with redis<br /><a href="http://stackoverflow.com/questions/10696463/mongodb-with-redis/10721249#10721249" target="_blank">http://stackoverflow.com/questions/10696463/mongodb-with-redis/10721249#10721249</a><br /><br />Caching Data in Spring Using Redis<br /><a href="http://caseyscarborough.com/blog/2014/12/18/caching-data-in-spring-using-redis/" target="_blank">http://caseyscarborough.com/blog/2014/12/18/caching-data-in-spring-using-redis/</a><br /><br />Springside Redis<br /><a href="https://github.com/springside/springside4/wiki/Redis" target="_blank">https://github.com/springside/springside4/wiki/Redis</a><br /><br />Spring Cache注解+Redis<br /><a href="http://hanqunfeng.iteye.com/blog/2176172" target="_blank">http://hanqunfeng.iteye.com/blog/2176172</a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/422026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-04 15:50 <a href="http://www.blogjava.net/paulwong/archive/2015/01/04/422026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>