Mongodb _id在同一集合中有两种不同的数据类型

问题描述

我正在处理的项目使用mongodb作为数据库,并且具有模拟数据生成器。 当通过模拟数据生成器生成数据时,它将在字符串中创建具有字符串ID的对象。 然后我们的后端应用程序Spring引导程序使用spring数据mongodb存储了_id为ObjectId的新对象

{
    "_id" : ObjectId("6163686f6c64722d30303031"),"email" : "Price36@hotmail.com","modeOfContact" : "EMAIL","name" : "Leonardo Walter","phone" : "08802273531"
}

{
    "_id" : "customer-1","email" : "Casimer_Jakubowski@hotmail.com","name" : "Kennedy Kilback","phone" : "07624333004"
}

现在,我们有了一个基于节点的应用程序,仅可使用“ mongodb”程序包来解析查询来进行调用。

当我对带有字符串_id的对象进行以下查询时,它会起作用

findDocument(COLLECTION_NAME,{ _id: args.id})

但是当对象具有_id作为ObjectId时查询失败

有没有一种方法可以通过提供_id和数据类型来搜索对象
喜欢

findDocument(COLLECTION_NAME,{  _id: args.id,$type: [ 'string','ObjectId']})

我知道使用$ type它将返回与_id匹配该类型的所有记录。只是想解释一下我想在这里实现的目标。

解决方法

但是当对象具有_id作为ObjectId时查询失败

要从nodejs中在mongo中查询ObjectId,您需要创建一个ObjectId:

var ObjectID = require('mongodb').ObjectID;

// Create a new ObjectID (hex string is 24 characters long)
var objectId = new ObjectID('6163686f6c64722d30303031');

// NOTE: you try to run `new ObjectID('customer-1');` you will get an Exception

findDocument(COLLECTION_NAME,{ _id: objectId})

我认为更好的方法是更新模拟程序,以插入有效的ObjectID而不是字符串,如果这对您而言并不重要,因为您需要保证_id的唯一性>

,

当对象具有_id作为ObjectId时,查询将失败

一种解决方法是仅在使用ObjectID的有效ObjectId时使用ObjectID.isValid()构造

const mongodb = require("mongodb").ObjectID;

const validId = mongodb.ObjectID.isValid(args._id);
/*only convert to ObjectID if validId true*/
const idToQuery = validId ? new mongodb.ObjectID(args._id) : args._id;

findDocument(COLLECTION_NAME,{ _id: idToQuery });

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...