我正在从事的项目使用mongodb作为DB,并有一个模拟数据生成器。当通过模拟数据生成器生成数据时,它会将带有字符串ID的对象创建到DB中。我们的后端应用程序spring boot使用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",
"modeOfContact" : "EMAIL",
"name" : "Kennedy Kilback",
"phone" : "07624333004"
}
现在我们有了一个仅用于fetch调用的基于节点的应用程序,它使用“MongoDB”包来解析查询。
当我对带有stringid的对象执行以下查询时,它会起作用
findDocument(COLLECTION_NAME, { _id: args.id})
但当对象将_id作为ObjectId时,查询将失败
有没有一种方法可以通过提供_id和数据类型来搜索对象
findDocument(COLLECTION_NAME, { _id: args.id , $type: [ 'string', 'ObjectId']})
我知道使用$type,它将返回所有_id与该类型匹配的记录。只是想解释一下我想在这里实现什么。
但当对象将_id作为ObjectId时,查询将失败
要在mongo中从nodejs查询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
构造,使用objectIsValid()
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 });