Node.js Mongodb\u id在同一个集合中有两种不同的数据类型

Node.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

我正在处理的项目使用mongodb作为数据库,并有一个模拟数据生成器。 当通过模拟数据生成器生成数据时,它会将带有字符串ID的对象创建到数据库中。 我们的后端应用程序Spring boot和Spring data 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"
}
现在我们有了一个只用于获取调用的基于节点的应用程序,它使用“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 });