sql >> データベース >  >> NoSQL >> MongoDB

node-mongodb-nativeドライバーで生のMongoDBクエリを実行できますか?

    注:質問が変更されました。以下の更新を参照してください。

    元の回答:

    はい。

    代わりに:

    db.tableName.find({ col: 'value' })
    

    次のように使用します:

    db.collection('tableName').find({ col: 'value' }, (err, data) => {
        if (err) {
            // handle error
        } else {
            // you have data here
        }
    });
    

    参照: http://mongodb.github.io /node-mongodb-native/2.2/api/Collection.html#find

    更新

    質問を変更してコメントを投稿すると、何をしたいのかがより明確になります。

    NodeでMongoシェルをエミュレートするという目標を達成するには、ユーザーが入力したコマンドを解析し、次の点に注意しながら適切なコマンドを実行する必要があります。

    1. Mongoシェルで使用されるSpiderMonkeyとV8およびlibuvを使用するNodeの違い
    2. BSONとJSONの違い
    3. Mongoシェルが同期的に動作し、Nodeドライバーが非同期的に動作するという事実

    最後の部分はおそらくあなたにとって最も難しい部分でしょう。 Mongoシェルでは、これは完全に合法であることを忘れないでください:

    db.test.find()[0].x;
    

    ノードでは、.find() メソッドは値を返しませんが、コールバックを受け取るか、promiseを返します。トリッキーになります。 db.test.find()[0].x; ケースはプロミスで比較的簡単に処理できるかもしれませんが(プロミスをよく理解している場合)、これは難しくなります:

    db.test.find({x: db.test.find()[0].x});
    

    また、任意にネストされたレベルを処理する必要があることを忘れないでください。

    モンゴプロトコル

    コメントのいくつかを読んだ後、実際にMongoサーバーに送信するものは、Mongoシェルで記述したJavaScriptとは何の関係もないことに注意する価値があると思います。 Mongoシェルは、多数の事前定義された関数とオブジェクトを備えたSpiderMonkeyを使用します。

    ただし、実際にはJavaScriptをMongoサーバーに送信しないため、db.collection.find()などを送信することはできません。 。むしろ、バイナリのOP_QUERYを送信します cstringとしてエンコードされたコレクション名とBSONとしてエンコードされたクエリ、および一連のバイナリフラグを持つ構造体。参照:

    BSON自体は、バイトとして定義されたいくつかの低レベル値を持つバイナリ形式です。

    肝心なのは、Mongoシェルに入力したものに似たものをMongoサーバーに送信しないということです。 Mongoシェルは、SpiderMonkeyパーサーを使用して入力したものを解析し、実際のMongoサーバーにバイナリリクエストを送信します。 MongoシェルはJavaScriptを使用しますが、JavaScriptでMongoサーバーと通信しません。

    JSONクエリオブジェクトでさえ、JSONとしてMongoに送信されません。たとえば、helloを含むドキュメントを検索する場合 {hello: 'world'}を使用する"world"に等しいプロパティ JavaScriptまたは{"hello": "world"}の場合 JSONでは、これがMongoサーバーに送信されるものです-Mongoシェルまたは他のMongoクライアントによって:

    \x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00   
    

    なぜそんなに違うのか

    Nodeで使用される構文がMongoシェルと大きく異なる理由を理解するには、次の回答を参照してください:




    1. MongoDBでサブストリングを置き換える2つの方法

    2. MongoDB、複数レベルのドット表記で既存の埋め込みドキュメントに新しい{フィールド:値}を追加しますか?

    3. マングース:IDに基づいて配列からオブジェクトを削除します(キャストエラー)

    4. SQLを使用したMongoDB結合のリンクと作成:パート3