提问者:小点点

mongoDBID在同一个集合中有两种不同的数据类型


我正在从事的项目使用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与该类型匹配的记录。只是想解释一下我想在这里实现什么。


共2个答案

匿名用户

但当对象将_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 });