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

Odpowiedzi:


419

Możesz to zrobić tak:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');

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


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

5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");

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

3

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

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

to najprostszy sposób


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.