Строка Node.js Mongoose.js для функции ObjectId

174

Есть ли функция, чтобы превратить строку в objectId в узле, используя mongoose? Схема указывает, что что-то является ObjectId, но когда оно сохраняется из строки, Монго говорит мне, что это все еще просто строка. Например, _id объекта отображается как objectId("blah").

JRPete
источник

Ответы:

419

Вы можете сделать это так:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');
Кевин Денте
источник
Да, это немного чище в этом случае. Может понадобиться использовать только mongo.BSONPure, если вы выполняете fromTime ()
talentedmrjones
3
Выдает ли это ошибку, если это неверная строка? Ищите лучший способ проверки ввода в API REST для полей идентификатора Монго.
Замбонилли
1
На самом деле не отвечает на вопрос, потому что при использовании этой методологии строка будет преобразована и будет отличаться от оригинала.
ed209
mongoose.Types.ObjectId (id), но мой идентификатор не определен, тогда что он вернет? новый идентификатор или ошибка
Кевал Бхатт
@KevinDente Я использую Nodejs с Typescript, я попробовал ваше решение, но все еще получаю строку, и мой запрос не возвращает того, что должен возвращать. Любая идея о том, как это сделать на машинописи?
Суфиане Фадил
9

Вы можете сделать это так:

var mongoose = require('mongoose');
var _id = mongoose.mongo.BSONPure.ObjectID.fromHexString("4eb6e7e7e9b7f4194e000001");

РЕДАКТИРОВАТЬ: новый стандарт имеет fromHexString, а не fromString

talentedmrjones
источник
1
Что ж, еще более «новый» стандарт выглядит как mongoose.mongo.BSONPure.ObjectID.createFromHexString () (по состоянию на mongoose 3.9.7)
Evereq
1
Для тех, кто пытается это сделать, это гораздо лучший ответ, чем выбранный, потому что он не изменит идентификатор, если вы уже используете идентификатор монго.
ed209
1
Это больше не работает, вместо этого используйте принятый ответ
paper1111
BSONPure не является частью mongoose.mongoдля меня. Кто-нибудь может подтвердить?
Артур Тагисов
5

Судя по комментариям, вы ищете:

mongoose.mongo.BSONPure.ObjectID.isValid

Или

mongoose.Types.ObjectId.isValid
В
источник
5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");
на паровой тяге
источник
3
Не могли бы вы прокомментировать разницу между mongoose.Types.ObjectIdи mongoose.mongo.ObjectId? Свойства объекта mongoose различны, но они могут ссылаться на тот же метод внизу. Пожалуйста, прокомментируйте основные методы Typesпротив mongo.
SteamPowered
5

Я не мог решить этот метод (по общему признанию, я не искал долго)

mongoose.mongo.BSONPure.ObjectID.fromHexString

Если ваша схема ожидает, что свойство имеет тип ObjectId, преобразование является неявным, по крайней мере, это похоже на случай в 4.7.8.

Однако вы можете использовать что-то вроде этого, что дает немного больше гибкости:

function toObjectId(ids) {

    if (ids.constructor === Array) {
        return ids.map(mongoose.Types.ObjectId);
    }

    return mongoose.Types.ObjectId(ids);
}
Билли Джейк О'Коннор
источник
3

Вы также можете использовать это

const { ObjectId } = require('mongodb');
const _id = ObjectId("4eb6e7e7e9b7f4194e000001");

это самый простой способ сделать это

Ash18
источник
0

Просто посмотрите фрагмент кода ниже, если вы реализуете REST API через Express и Mongoose. (Пример для ADD)

....
exports.AddSomething = (req,res,next) =>{
  const newSomething = new SomeEntity({
 _id:new mongoose.Types.ObjectId(), //its very own ID
  somethingName:req.body.somethingName,
  theForeignKey: mongoose.Types.ObjectId(req.body.theForeignKey)// if you want to pass an object ID
})
}
...

Надеюсь, поможет

Манодж Кумар
источник