7
votes

Comment puis-je savoir à MongoDB si un champ est un type de date?

Je travaille sur une application Nodejs + MongoDB.

Je viens d'insérer un enregistrement dans mongodb à l'aide du client de la console: xxx

La chose est, quand je suis à nœud.js, j'ai besoin de savoir si Le champ "mydate" est vraiment un type de date, afin d'effectuer une requête de plage de données, etc.

J'ai essayé ce qui suit.

1. Sur la console client de Mongo: xxx

2. Sur mon code Nodejs,

J'essaie d'obtenir le type d'appel de ce gettypeMembers fonction. (Obj Comming à partir d'une requête de DB) xxx

};

Ce que j'obtiens dans cette méthode est le suivant: "chaîne" , quand j'ai besoin de "date"

y a-t-il d'autre moyen d'obtenir une sorte de "date" résultat "


7 commentaires

Vous ajoutez des documents avec mydate comme d'autres types ailleurs? Je suppose que je suis confondu sur ce que vous essayez d'accomplir ici.


Non, j'utilise toujours la même structure. Je comprends votre question, c'est tout parce que mon webApp a besoin d'obtenir des données de plusieurs collections et que les collections sont créées de manière dinamiquement par d'autres applications, alors ... Mon WebApp ne sait jamais quel schéma est derrière chaque collection. J'espère que cela aidera à nettoyer mon idée.


Et si vous avez rencontré db.user.mydate instanceof isodate à la place? Je pense que nœud.js traduit isodate directement dans son pilote.


Y a-t-il une autre façon d'obtenir tous les types de collection?


Votre utilisation d'un analyseur JSON, la date n'aura aucun type d'objet, ce sera simplement un objet ... puisque JSON ne peut pas héberger des objets sous sa forme vraie. Il devrait y avoir un sous-champ appelé $ Date dans l'objet de la date, vérifiez cela.


Lorsque vous appelez json stringify, l'objet de date est modifié en une chaîne var a = {A: nouvelle date ()} Utilisation de JSON.Stringify (A) devient '{"A": "2012-09-28T11: 05: 56.163Z" } '. Vous devez vérifier contre les types BSON réels et non l'objet JSON strongifié / analysé qui le réduire aux types JavaScript de base pris en charge par JSON (et la date n'est pas celle d'entre elles).


Merci @christkv, j'ai remarqué cela. Maintenant, j'ai le même problème lorsque vous vérifiez le BSON Obj. Jetez un coup d'œil aux Nexts réponses ..


4 Réponses :


4
votes

Vous pouvez utiliser l'opérateur de type $ pour interroger les champs d'un type spécifique: xxx

9 étant le numéro du type de date, voir http://www.mongodb.org/display/docs/advanced+queries#advancedQueries-%24type

de déterminer le type à l'intérieur du nœud.js, cela dépend de votre pilote. J'en ai utilisé aucun, mais cela pourrait être un prototype spécifique, comme l'obtention de l'objectid. Peut-être que vous pourriez examiner l'objet et rechercher le nom du constructeur.


1 commentaires

Désolé mec, mais je ne comprends pas votre idée. Ce que je fais, c'est obtenir un enregistrement de la collection et analyser le champ par champ et faire des choses spécifiques en fonction du type de champ. Mon problème est que je reçois un type de chaîne au lieu d'un type de date. J'utilise le conducteur nœud-mongodb-natif.



2
votes

Je suis un peu confus par l'utilisation de xxx pré>

dans votre exemple. Faites-vous cet appel exact sur l'objet DB que Node-MongoDb-Native vous donne? Si tel est le cas, vous devriez être indéfini car vous n'obtenez pas réellement à la base de la base de données, mais à la recherche d'une propriété de l'objet DB JavaScript (une propriété qui est presque tout certitude non là). P>

Pourriez-vous poster Le code que vous utilisez du processus NODE.JS? J'ai testé votre code, à l'aide d'une insertion de shell identique, et une fois que j'ai récupéré le doc de la base de données dans Node.js, p> xxx pré>

renvoyé true. P>

Je ne connais pas non plus votre candidature, mais il me semble mal conseillé d'interroger les collections où vous ne connaissez pas les types de données. Pourquoi vous assurez-vous quel type de valeur les autres applications utilisez-vous pour le champ MyDate? P>

EDIT: strong> p>

var coll = new mongo.Collection(client, 'user');
    coll.find({}).toArray(function(err, docs) {
    docs.forEach(function (doc) {
        console.log(doc);
        console.log(doc.myDate instanceof Date);
    });
});


8 commentaires

Je l'ai fait, directement sur la console client de Mongo. Je l'ai fait de nouveau, et c'est la même chose. Il retourne faux, pourquoi? J'utilise v2.0.4


Quoi qu'il en soit, je vais ajouter plus d'informations sur mon message afin de clarifier ce que je fais de l'autre côté, Nodejs


`Mais il me semble mal apprécié d'interroger des collections dont vous ne savez pas le schéma.» N'est-ce pas un peu le design de la schéma de Mongodbs?


dans une certaine mesure, mais dans les environnements de production, il est une bonne pratique de savoir quels champs, quels types sont dans votre base de données


Shelman, je ne comprends pas. Reproducter votre code, il retourne faux pour moi. (!?!!! !!?)


Mon WebApp est une visionneuse de données. Il doit donc être capable de montrer différents types de données sous différentes vues. Une de ces visites doit être une grille de données intelligente, où elle détecte un type de date, il doit afficher un sélecteur de calendrier pour les requêtes. Thins comme ça ... espérons que ça vous aide.


Aller plus loin, si je vérifie le type de données dans la console client de Mongo, je ne suis pas vrai lorsque vous demandez un type de date. Le problème doit être là, vous les gars, quelle version de Mongo utilisez-vous?


@Larrytron J'utilise personnellement 1,9 Cos, je ne peux jamais sembler trouver le temps de passer à la mise à niveau mais que vous devriez utiliser personnellement 2.2.



1
votes

À en juger par votre dernière modification, je crois que je vois le problème. Vous analysez le document dans JSON. Contrairement à BSON, JSON ne prend pas en charge la création et le stockage littéraux des objets BSON. L'objet isodate est un type de données BSON.

Alors, lorsque vous convertissez en JSON, vous perdez réellement cet objet.

Vous pouvez résoudre ces deux manières:

  • Ne convertissez pas en JSON jusqu'à ce que vous ayez vérifié le type de champ
  • Chaque objet a des propriétés. La date n'est pas différente, il devrait avoir une propriété $ propriété (je crois) que vous pouvez vérifier si isset pour voir si le champ est de type date de type

8 commentaires

Très intéressant. J'allais changer cela, mais je me suis rendu compte (vous verrez dans la réponse suivante) qu'une fois que je reçois l'objet de la base de données, je perds son type ... je vais garder des combats


@Larrytron très intéressant en effet, vous ne devriez pas perdre le type d'objet dans la console. Qu'utilisez-vous pour choisir et itérair les documents de la console?


Dans la console, comme je l'ai posté, typeof db.user.mydate -> il renvoie "objet" db.user.mydate instance de date -> il renvoie "false"


Mais si je fais: db.user.find ({mydate: {$ Type: 9}}) Il renvoie les résultats, donc cela signifie que cela signifie que cela signifie. N'est-ce pas?


@Larrytron en effet c'est, ah cela est vraiment déroutant: s


@Larrytron Yea Ce que je voulais dire par le code de la console est comme ce que vous avez montré pour votre code nœud.js, la boucle elle-même. Accrochez-vous que je viens de réaliser que vous essayez d'obtenir le type db.user.mydate directement sans extraire le document de la DB. Cela reviendra de faux tout le temps. Essayez de faire une requête pour l'utilisateur enregistré, puis testez ce résultat.


Oui! vous avez raison. Ça marche. db.user.find ({}, {mydate: 1}). foreach (fonction (F) {imprimé (instance d'impression de la date)}); retourne vrai! Maintenant, où devrait être le problème? Je fais la même chose à Nodejs, mais je suis "faux", devrais-je devoir changer de pilote?


@Larrytron Je dois admettre si vous utilisez le code Shelmans dans Node.js Je suis parfaitement excentré :(



4
votes

J'ai enfin trouvé ma solution.

Comme @christkv a dit, une fois que vous appelez un JSON StringIfy, tous les types d'origine sont définitivement perdus. Alors, pensez-y de cette façon, ma méthode gettypeMembers code> fonctionne parfaitement pour moi. p>

Notez que, le paramètre Obj provient de la base de données, ainsi que "_ID" (identificateur de MongoDB) est directement envoyé afin d'éviter des problèmes lors de la fonction de la fonction récursive: P>

typeof db.user.myDate --> It returns "Object"
db.user.myDate instanceof Date --> It returns "false"


1 commentaires

La dernière partie, dans la console de Mongo, renvoie false car db.user est de type collection et à cause de la manière dont la console accède aux objets (via des magies comme dans PHP), le champ Date revient toujours comme un objet valide mais comme un objet vide avec un type de classe STD. Donc, db.user ne sera jamais querérable pour son type de champ uniquement les documents de l'objet de collecte lorsque vous effectuez une trouvaille de curseur.