Node.js 使用 MongoDB 的 ObjectId 作为查询条件

Stella981
• 阅读 710

当往MongoDB中插入一条数据时,会自动生成ObjectId作为数据的主键。 那么如何通过ObjectId来做数据的唯一查询呢?

在MongoDB中插入一条数据

在MongoDB中插入一条如下结构的数据:

{
  _id: 5d6a32389c825e24106624e4,
  title: 'GitHub 上有什么好玩的项目',
  content: '上个月有水友私信问我,GitHub 上有没有比较好玩的项目可以推荐?我跟他说:"有,过两天我整理一下"。\n' +
    '\n' +
    '然而,一个月过去了,我把这件事情忘了精光,直至他昨天提醒我才记起2_05.png。\n',
  creation: 2019-08-31T08:39:20.384Z
}

其中,上述_id的值“5d6a32389c825e24106624e4”,是MongoDB自动分配的。

使用 MongoDB 的 ObjectId 作为查询条件

须知,_id的值“5d6a32389c825e24106624e4”并非是字符串,而是ObjectId对象类型。因此,如下查询是行不通的:

// 查询指定文档
const findNews = function (db, newsId, callback) {
    // 获取集合
    const news = db.collection('news');

    // 查询指定文档
    news.findOne({_id: newsId},function (err, result) {
        if (err) {
            console.error('error end: ' + err.stack);
            return;
        }
        
        console.log("查询指定文档,响应结果是:");
        console.log(result);
        callback(result);
    });
}

需将上述newsId转为 ObjectId对象类型。怎么做呢?做法参考如下:

const ObjectId = require('mongodb').ObjectId;

// 查询指定文档
const findNews = function (db, newsId, callback) {
    // 获取集合
    const news = db.collection('news');

    // 查询指定文档
    news.findOne({_id: ObjectId(newsId)},function (err, result) {
        if (err) {
            console.error('error end: ' + err.stack);
            return;
        }
        
        console.log("查询指定文档,响应结果是:");
        console.log(result);
        callback(result);
    });
}

其中,require('mongodb').ObjectId用于获取ObjectId类,并将字符串newsId转为了 ObjectId 类型。

参考引用

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
陈占占 陈占占
2年前
Python Django 循环插入到 MongoDB数据库中
二级标题单对单表关联:开始先循环插入数据到MongoDB中,然后把表1的ID放到表2中,然后就可以通过表2来查看表1了importrandomimportpymongo'''DBRef关联的表'''frombson.dbrefimportDBReffromdjango.httpimportHttpResponsefrombson.obj
Stella981 Stella981
3年前
Python将字符串转换成ObjectId类型
MongoDB自动生成的_id是ObjectId类型的。我需要将MongoDB的_id存到ElasticSearch中,而ElasticSearch又只能存String类型的_id,所以就涉及到两种类型的转换。ObjectId类型—→String类型这个非常简单
Stella981 Stella981
3年前
MongoDB ObjectId详解及使用
MongoDB中我们经常会接触到一个自动生成的字段:”\_id”,类型为ObjectId。本文详解ObjectId的构成和使用。ObjectId构成之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。但在分布式环境下,这种方法就不可行了,会产生冲突。为此,MongoDB采用了一个称之为ObjectId的类型来做主
Wesley13 Wesley13
3年前
MongoDB 数据类型
一.MongoDB之数据类型Object ID:Documents自动生成的\_id,插入数据时候会生成 \_id,唯一字段String:字符串,必须是utf8Boolean:布尔值,true或者falseInteger:整数(Int32Int64你们就知道有个Int就行了,一般我们用Int32)Doub
Wesley13 Wesley13
3年前
mysql 未定义主键,mysql 如何处理?
InnoDB会自动帮你创建一个不可见的、长度为6字节的row\_id,而且InnoDB维护了一个全局的dictsys.row\_id,所以未定义主键的表都会共享该row\_id,每次插入一条数据都把全局row\_id当成主键id,然后全局row\_id加1。该全局row\_id在代码实现上使用的事bigintunsigned类型,但实际上只给row\_
Stella981 Stella981
3年前
Mongo _id 生成和使用
MongoDB中我们经常会接触到一个自动生成的字段:”\_id”,类型为ObjectId。ObjectId构成之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。但在分布式环境下,这种方法就不可行了,会产生冲突。为此,MongoDB采用了一个称之为ObjectId的类型来做主键。ObjectId是一个12字节的BSON类型字符串。按照字节顺
Stella981 Stella981
3年前
HBase & MongoDB
1.Mongodbbson文档型数据库,整个数据都存在磁盘中,hbase是列式数据库,集群部署时每个familycolumn保存在单独的hdfs文件中。2.Mongodb主键是“\_id”,主键上面可以不建索引,记录插入的顺序和存放的顺序一样,hbase的主键就是rowkey,可以是任意字符串(最大长度是64KB,实际应用中长度一般为1010
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究