问题描述
我正在处理的项目使用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 });