Node.js Mongoose.js do funkcji ObjectId

174

Czy istnieje funkcja, która zamienia ciąg znaków w objectId w węźle za pomocą mongoose? Schemat określa, że ​​coś jest ObjectId, ale kiedy jest zapisywane z łańcucha, mongo mówi mi, że nadal jest to tylko ciąg. Na przykład identyfikator _id obiektu jest wyświetlany jako objectId("blah").

JRPete
źródło

Odpowiedzi:

419

Możesz to zrobić tak:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');
Kevin Dente
źródło
Tak, w tym przypadku jest trochę czystszy. Może wystarczy użyć mongo.BSONPure, jeśli robisz fromTime ()
talentedmrjones
3
Czy powoduje to błąd, jeśli jest to nieprawidłowy ciąg? Szukasz najlepszego sposobu na sprawdzenie poprawności danych wejściowych w REST API dla pól identyfikatora mongo.
Zambonilli,
1
Tak naprawdę nie odpowiada na pytanie, ponieważ przy użyciu tej metodologii ciąg zostanie przekonwertowany i nie będzie taki sam jak oryginał.
ed209
mongoose.Types.ObjectId (id), ale mój identyfikator jest niezdefiniowany, co zwróci? nowy identyfikator lub błąd
Keval Bhatt
@KevinDente Używam Nodejs z Typescriptem, wypróbowałem twoje rozwiązanie, ale nadal otrzymuję ciąg, a moje zapytanie nie zwraca tego, co powinno zwrócić. jakiś pomysł, jak to zrobić na maszynie?
SOufiane Fadil,
9

Możesz to zrobić w ten sposób:

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

EDYCJA: Nowy standard ma fromHexString zamiast fromString

utalentowani
źródło
1
Cóż, jeszcze bardziej „nowym” standardem wydaje się być mongoose.mongo.BSONPure.ObjectID.createFromHexString () (od mongoose 3.9.7)
Evereq
1
Dla tych, którzy próbują to zrobić, jest to znacznie lepsza odpowiedź niż wybrana odpowiedź, ponieważ nie zmieni ona identyfikatora, jeśli już używasz identyfikatora mongo.
ed209
1
To już nie działa, zamiast tego użyj zaakceptowanej odpowiedzi
paper1111
BSONPure nie jest częścią mongoose.mongodla mnie. Czy ktoś może potwierdzić?
Artur Tagisow
5

Sądząc po komentarzach, szukasz:

mongoose.mongo.BSONPure.ObjectID.isValid

Lub

mongoose.Types.ObjectId.isValid
W
źródło
5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");
steampowered
źródło
3
Czy mógłbyś skomentować różnicę między mongoose.Types.ObjectIdi mongoose.mongo.ObjectId? Właściwości obiektu mangusty są różne, ale mogą odnosić się do tej samej metody poniżej. Proszę o komentarz na temat metod leżących na Typesżywo mongo.
steampowered
5

Nie mogłem rozwiązać tej metody (wprawdzie nie szukałem długo)

mongoose.mongo.BSONPure.ObjectID.fromHexString

Jeśli schemat oczekuje, że właściwość będzie typu ObjectId, konwersja jest niejawna, przynajmniej wydaje się, że tak jest w przypadku wersji 4.7.8.

Możesz jednak użyć czegoś takiego, co daje trochę więcej elastyczności:

function toObjectId(ids) {

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

    return mongoose.Types.ObjectId(ids);
}
Billy Jake O'Connor
źródło
3

Możesz również tego użyć

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

to najprostszy sposób

Ash18
źródło
0

Zobacz tylko poniższy fragment kodu, jeśli implementujesz interfejs API REST za pomocą ekspresu i mongoose. (Przykład dodania)

....
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
})
}
...

Mam nadzieję, że to pomoże

Manoj Kumar
źródło