奶茶不加糖 發表於 2020-7-12 21:27:00

mongoDB的ObjectId和查询条件

<h4><strong>一、ObjectId</strong></h4>
<p>在插入数据时,mongoDB 会自动生成"_id",默认生成的"_id"属于 ObjectId 对象,作用类似于身份证号用来标识每一条数据。</p>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712194117440-395737822.png"></p>
<p>&nbsp;ObjectId 是一个12字节(16进制) BSON 类型数据,格式分四部分组成4|3|2|3:</p>
<ul>
<li>4个字节时间戳</li>
<li>3个字节机器标识码</li>
<li>2个字节进程id(PID)</li>
<li>3个字节随机数</li>
</ul>
<div class="cnblogs_code">
<pre>例如:ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>)    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">5f09c177 9a5b2a 836d 9000b3</span>
5f09c177         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">时间戳</span>
9a5b2a         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">机器标识码</span>
836d             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进程id</span>
9000b3         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机数(自动增加的计数器)</span></pre>
</div>
<p>因为 ObjectId 中存储了时间戳,所以可以直接从中获取时间信息:</p>
<div class="cnblogs_code">
<pre>ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp()   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取时间信息</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712201259057-622779721.png"></p>
<p>&nbsp;也可以再进行获取年月日时分秒信息,如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712203046720-2079666936.png"></p>
<div class="cnblogs_code">
<pre>ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp().getFullYear()   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">年</span>
ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp().getMonth()      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">月,注意这里的月份是从0开始的(0-11),所以实际使用时可能需要加1</span>
ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp().getDate()         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">日</span>
ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp().getHours()      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">时,注意这里的加了8</span>
ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp().getMinutes()      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">分</span>
ObjectId(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5f09c1779a5b2a836d9000b3</span><span style="color: rgba(128, 0, 0, 1)">"</span>).getTimestamp().getSeconds()      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">秒</span></pre>
</div>
<h4><strong>二、查询条件(query)</strong></h4>
<p>查询条件在很多地方都可以用到,比如 find() | findOne() | update()&nbsp;| remove&nbsp;| aggregate() 里的 $match 等<em id="__mceDel" style="font-family: &quot;Courier New&quot;; font-size: 12px"><span class="pln"><br></span></em></p>
<p>1. 比较大小:</p>
<ul>
<li>(&gt;) 大于 - $gt</li>
<li>(&lt;) 小于 - $lt</li>
<li>(&gt;=) 大于等于 - $gte</li>
<li>(&lt;= ) 小于等于 - $lte</li>
<li>(=) 等于 - $eq</li>
<li>(!=) 不等于 - &amp;ne</li>





</ul>
<p>例:</p>
<div class="cnblogs_code">
<pre>db.grades.<span style="color: rgba(0, 0, 255, 1)">find</span>({English:{$gt:<span style="color: rgba(128, 0, 128, 1)">90</span>}})      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询英语成绩大于90的数据</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712205404551-1593158530.png"></p>
<p>&nbsp;2.&nbsp;and, in 和 or</p>
<div class="cnblogs_code">
<pre>db.grades.<span style="color: rgba(0, 0, 255, 1)">find</span>({$and:[{English:{$gt:<span style="color: rgba(128, 0, 128, 1)">60</span>}},{name:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Bob</span><span style="color: rgba(128, 0, 0, 1)">"</span>}]})   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">and 条件并列查询</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712211157161-353207991.png"></p>
<div class="cnblogs_code">
<pre>db.grades.<span style="color: rgba(0, 0, 255, 1)">find</span>({name:{$<span style="color: rgba(0, 0, 255, 1)">in</span>:[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Tim</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">John</span><span style="color: rgba(128, 0, 0, 1)">'</span>]}})             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">in 多值查询</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200725211155757-448960542.png"></p>
<div class="cnblogs_code">
<pre>db.grades.<span style="color: rgba(0, 0, 255, 1)">find</span>({$or:[{English:{$gt:<span style="color: rgba(128, 0, 128, 1)">60</span>}},{name:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Bob</span><span style="color: rgba(128, 0, 0, 1)">"</span>}]})   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">or 条件或查询</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712211332504-1010359859.png"></p>
<div class="cnblogs_code">
<pre>db.grades.<span style="color: rgba(0, 0, 255, 1)">find</span>({English:{$exists:<span style="color: rgba(0, 0, 255, 1)">false</span>}})    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查询English字段不存在的数据</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200725211539790-2124867774.png"></p>
<p>&nbsp;3. 正则查询(Regex)</p>
<div class="cnblogs_code">
<pre>db.grades.<span style="color: rgba(0, 0, 255, 1)">find</span>({name:/J/})   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模糊查询名字中含字母"J"的数据</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/2094936/202007/2094936-20200712212639369-1239242869.png"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yh2020/p/13289995.html
頁: [1]
查看完整版本: mongoDB的ObjectId和查询条件