Node.js Mongoose.js String zur ObjectId-Funktion

174

Gibt es eine Funktion, um eine Zeichenfolge mit Mungo in eine Objekt-ID im Knoten umzuwandeln? Das Schema gibt an, dass etwas eine ObjectId ist, aber wenn es aus einer Zeichenfolge gespeichert wird, sagt mir Mongo, dass es immer noch nur eine Zeichenfolge ist. Die _id des Objekts wird beispielsweise als angezeigt objectId("blah").

JRPete
quelle

Antworten:

419

Sie können es so machen:

var mongoose = require('mongoose');
var id = mongoose.Types.ObjectId('4edd40c86762e0fb12000003');
Kevin Dente
quelle
Ja, das ist in diesem Fall etwas sauberer. Möglicherweise müssen Sie nur mongo.BSONPure verwenden, wenn Sie fromTime ()
talentierte
3
Wirft dies einen Fehler, wenn es sich um eine ungültige Zeichenfolge handelt? Suchen Sie nach dem besten Weg, um eine Eingabevalidierung in einer REST-API für Mongo-ID-Felder durchzuführen.
Zambonilli
1
Beantwortet die Frage nicht wirklich, da bei Verwendung dieser Methode die Zeichenfolge konvertiert wird und nicht mit dem Original übereinstimmt.
ed209
mongoose.Types.ObjectId (id), aber meine ID ist undefiniert, was wird sie dann zurückgeben? neue ID oder Fehler
Keval Bhatt
@ KevinDente Ich verwende Nodejs mit Typescript. Ich habe Ihre Lösung ausprobiert, erhalte aber immer noch eine Zeichenfolge und meine Abfrage gibt nicht zurück, was sie zurückgeben soll. Irgendeine Idee, wie man es mit Typoskript macht?
SOufiane Fadil
9

Sie können es so machen:

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

BEARBEITEN: Neuer Standard hat fromHexString anstelle von fromString

talentierte mrjones
quelle
1
Nun, noch mehr "neuer" Standard scheint mongoose.mongo.BSONPure.ObjectID.createFromHexString () (ab Mungo 3.9.7) zu sein
Evereq
1
Für diejenigen, die dies versuchen, ist dies eine viel bessere Antwort als die ausgewählte Antwort, da die ID nicht transformiert wird, wenn Sie bereits eine Mongo-ID verwenden.
ed209
1
Dies funktioniert nicht mehr, verwenden Sie stattdessen die akzeptierte Antwort
paper1111
BSONPure gehört mongoose.mongofür mich nicht dazu. Kann jemand bestätigen?
Artur Tagisow
5

Nach den Kommentaren zu urteilen, suchen Sie:

mongoose.mongo.BSONPure.ObjectID.isValid

Oder

mongoose.Types.ObjectId.isValid
BEIM
quelle
5
var mongoose = require('mongoose');
var _id = mongoose.mongo.ObjectId("4eb6e7e7e9b7f4194e000001");
dampfbetrieben
quelle
3
Könnten Sie den Unterschied zwischen mongoose.Types.ObjectIdund kommentieren mongoose.mongo.ObjectId? Die Objekteigenschaften von Mungo sind unterschiedlich, sie verweisen jedoch möglicherweise auf dieselbe Methode darunter. Bitte kommentieren Sie die zugrunde liegenden Methoden auf Typesvs mongo.
Steampowered
5

Ich konnte diese Methode nicht auflösen (zugegebenermaßen habe ich nicht lange gesucht)

mongoose.mongo.BSONPure.ObjectID.fromHexString

Wenn Ihr Schema erwartet, dass die Eigenschaft vom Typ ObjectId ist, ist die Konvertierung implizit, zumindest scheint dies in 4.7.8 der Fall zu sein.

Sie könnten jedoch so etwas verwenden, was etwas mehr Flexibilität bietet:

function toObjectId(ids) {

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

    return mongoose.Types.ObjectId(ids);
}
Billy Jake O'Connor
quelle
3

Sie können dies auch verwenden

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

Es ist der einfachste Weg, dies zu tun

Ash18
quelle
0

Sehen Sie sich einfach das folgende Code-Snippet an, wenn Sie eine REST-API über Express und Mungo implementieren. (Beispiel für 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
})
}
...

Ich hoffe es hilft

Manoj Kumar
quelle