Node.js Mongodb\u id在同一个集合中有两种不同的数据类型
我正在处理的项目使用mongodb作为数据库,并有一个模拟数据生成器。 当通过模拟数据生成器生成数据时,它会将带有字符串ID的对象创建到数据库中。 我们的后端应用程序Spring boot和Spring data mongodb存储了新对象,其中_id为ObjectIdNode.js Mongodb\u id在同一个集合中有两种不同的数据类型,node.js,mongodb,graphql,express-graphql,Node.js,Mongodb,Graphql,Express Graphql,我正在处理的项目使用mongodb作为数据库,并有一个模拟数据生成器。 当通过模拟数据生成器生成数据时,它会将带有字符串ID的对象创建到数据库中。 我们的后端应用程序Spring boot和Spring data mongodb存储了新对象,其中_id为ObjectId { "_id" : ObjectId("6163686f6c64722d30303031"), "email" : "Price36@hotm
{
"_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"
}
现在我们有了一个只用于获取调用的基于节点的应用程序,它使用“mongodb”包来解析查询
当我对字符串为_id的对象执行以下查询时,它会工作
findDocument(COLLECTION_NAME, { _id: args.id})
但当对象的_id作为ObjectId时,查询将失败
是否有一种方法可以通过提供id和数据类型来搜索对象像 我知道$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})
我认为更好的方法是更新mock以插入有效的ObjectID
,而不是字符串,如果这对您来说无关紧要,因为您需要保证\u id的唯一性
当对象的_id作为ObjectId时,查询失败
实现这一点的一种方法是仅在其为有效的ObjectId
using时使用构造
感谢@Manuel的回复,但发生的事情是,有时我将_id作为字符串,有时从前端获取ObjectId。我尝试了你的解决方案,当来自前端的_id是十六进制字符串时,它会工作,否则它会引发异常。我还尝试通过模拟数据添加ObjectId,在一些集合中,我引用了一些对象中的对象。在这种情况下,在我的java端,只有当我使用_id字段进行查询时,我才会得到结果,即_id是ObjectId,当我在对象中请求引用时,我就会得到空结果。`SomeEntity findById(String id)`返回预期结果,因为_id是ObjectId,但
SomeEntity findByReferenceId(String refId)
返回空结果,因为ReferenceId只是十六进制字符串如果您使用混合格式,您可以在创建新对象时添加一个try{}catch{}
,确保这看起来是一个快速解决方案
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})
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 });