7

私はNodeJS + Mongodbアプリに取り組んでいます。

コンソール クライアントを使用して mongodb に 1 つのレコードを挿入しました。

db.user.save({myId:11111, myDate: ISODate("2012-04-30T00:00:00.000Z")})

問題は、私がnode.jsにいるとき、データ範囲のクエリなどを実行するために、「mydate」フィールドが実際に日付タイプであるかどうかを知る必要があるということです。

以下を試しました。

1. mongo クライアント コンソールで:

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

2. Nodejs コードで、

getTypeMembersこの関数を呼び出す型を取得しようとしています。(db クエリからの obj)

exports.getTypeMembers = function(obj) {
obj = JSON.parse(JSON.stringify(obj)

for(var _k in obj){
    if(Object.prototype.toString.call(obj[_k]) === '[object Array]' ) {
        obj[_k] = "Array";
    }
    else if(typeof(obj[_k])=="object"){
        obj[_k] = this.getTypeMembers(obj[_k]);
    }else{
        obj[_k] = typeof (obj[_k]);
    }
}
return obj;

};

このメソッドで得られるのは: "String"、必要なとき"Date"

何らかの"Date"結果を得る他の方法はありますか?

4

4 に答える 4

4

$type 演算子を使用して、特定のタイプのフィールドを照会できます。

db.col.query({a: {$type: 9}})

9 は日付タイプの番号です 。http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24typeを参照してください。

node.js 内の型の決定に関しては、ドライバーによって異なります。私は何も使用していませんが、ObjectId のように、特定のプロトタイプである可能性があります。おそらく、オブジェクトを調べてコンストラクター名を探すことができます。

于 2012-09-27T11:43:25.930 に答える
4

私はついに私の解決策を見つけました。

@christkv が言ったように、JSON stringify を呼び出すと、元の型はすべて確実に失われます。ですから、このように考えると、私の方法getTypeMembersは私にとって完璧に機能します。

再帰関数を実行する際の問題を回避するために、obj パラメータが DB から取得され、「_id」(mongodb 識別子) が直接省略されていることに注意してください。

exports.getTypeMembers = function(obj) {
    for(var _k in obj){
        if (_k =="_id") continue;
        if (Object.prototype.toString.call(obj[_k]) === "[object Number]"){
            obj[_k] = "Number";
        }else if (Object.prototype.toString.call(obj[_k]) === "[object String]"){
            obj[_k] = "String";
        }else if (Object.prototype.toString.call(obj[_k]) === "[object Date]"){
            obj[_k] = "Date";
        } else if(Object.prototype.toString.call(obj[_k]) === '[object Array]' ) {
            obj[_k] = "Array";
        } else if(typeof(obj[_k])=="object"){
            obj[_k] = this.getTypeMembers(obj[_k]);
        } else{
            obj[_k]  = (typeof obj[_k])[0].toUpperCase() + (typeof obj[_k]).slice(1);
        }
    }
    return obj;
};

Mongo コンソール部分では、次の操作を行う型のみを取得できます。

db.user.find({},{myDate:1}).forEach(function(f) { print (f.myDate instanceof Date) } );

しかし、もしそうなら、

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

理由はまだわかりません。

于 2012-10-01T09:30:03.727 に答える
2

私はの使用に少し混乱しています

db.user.myDate

あなたの例では。node-mongodb-native が提供する Db オブジェクトに対して、この正確な呼び出しを行っていますか? その場合、実際にはデータベースにクエリを実行するのではなく、Db javascript オブジェクトのプロパティ (ほぼ確実に存在しないプロパティ) をチェックするため、未定義になるはずです。

node.js プロセスから実行しているコードを投稿していただけますか? 同じシェル挿入を使用してコードをテストし、node.js のデータベースからドキュメントを取得したら、

doc.myDate instanceof Date

true を返しました。

私もあなたのアプリケーションに精通していませんが、データのタイプがわからないコレクションを照会することはお勧めできません。他のアプリケーションが myDate フィールドに使用している値のタイプがわからないのはなぜですか?

編集:

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

自分のシェルに同じシェルを挿入した後にnodejsで実行すると、「true」がログに記録されます。実行するとどうなりますか?

于 2012-09-27T14:26:08.047 に答える
1

あなたの最新の編集から判断すると、問題があると思います。ドキュメントを JSON に解析しています。BSON とは異なり、JSON は BSON オブジェクトのリテラルの作成と保存をサポートしていません。ISODateオブジェクトは BSON データ型です。

したがって、JSON に変換すると、実際にはこのオブジェクトが失われます。

この 2 つの方法で解決できます。

  • フィールドの型を確認するまで JSON に変換しないでください
  • すべてのオブジェクトにはプロパティがあります。日付も同じです。フィールドが日付型か$dateどうかを確認できるプロパティが必要です(私は信じています)。isset
于 2012-09-27T18:15:05.080 に答える