2011-04-13 4 views

Répondre

10

Vous devez comparer la valeur _id à une instance de BinData (pas à une chaîne). Malheureusement, le constructeur BinData prend une chaîne Base64 au lieu d'une chaîne hexadécimale.

Votre valeur GUID manque deux chiffres hexadécimaux à la fin, donc pour les besoins de cet exemple, je suppose qu'ils sont "00". Les valeurs suivantes sont équivalentes:

hex: "E3E45566-AFE4-A564-7876-AEFF6745FF00" (ignoring dashes)

base64: "ZlXk4+SvZKV4dq7/Z0X/AA=="

Ainsi, votre requête devrait être:

>db.person.find({_id : new BinData(3, "ZlXk4+SvZKV4dq7/Z0X/AA==")})

Je suppose que le sous-type binaire a été correctement réglé sur 3. Dans le cas contraire, ce pilote a été utilisé pour créer les données ?

+2

oh cher, ce n'est pas très convivial est-il! Je vais hydrater un MongoDB à partir de MSSQL, en utilisant des guids existants comme des clés, et exécuter des requêtes spot de temps en temps. Je suppose que je vais devoir trouver un moyen facile de convertir manuellement les guids hex en base64. Merci de votre aide! – Journeyman

+0

Je sais ... J'ai essayé de trouver une fonction Javascript qui convertirait une chaîne hexadécimale en une chaîne Base64 mais il ne semble pas y en avoir une intégrée dans la langue. Vous pouvez rechercher les fonctions que les gens ont écrites pour le faire. Ou vous pourriez écrire votre programme d'importation en C# au lieu de Javascript? –

+3

Pour convertir le GUID en base64: 'Convert.ToBase64String (Guid.NewGuid(). ToByteArray())' –

15

Vous pouvez utiliser facilement:

.find({ "_id" : CSUUID("E3E45566-AFE4-A564-7876-AEFF6745FF")}) 
+2

CSUUID n'est pas "standard" en mongo. Vous devez récupérer le fichier à partir de csharpdriver et l'inclure lors du démarrage du shell. Plus d'informations à ce sujet ici: http://stackoverflow.com/a/8252047/111625 –

4

Vous pouvez utiliser la fonction js suivante devant votre requête comme ceci:

function LUUID(uuid) { 
    var hex = uuid.replace(/[{}-]/g, ""); // removes extra characters 
    return new UUID(hex); //creates new UUID 
} 

db.person.find({"_id" : LUUID("E3E45566-AFE4-A564-7876-AEFF6745FF"}); 

Vous pouvez enregistrer la fonction dans le fichier .js et le charger ou ouvrez-le avant de faire votre requête et si vous copiez la valeur de vos résultats, vous devez renommer la fonction avec:

  • L UUID Legacy UUID
  • JUUID pour Java encodage
  • NUUID pour .net encodage
  • CSUUID pour C# encodage
  • PYUUID pour l'encodage python
Questions connexes