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

mongodbは検索クエリで文字列として_idを取得します

    MongoDB4.0は$convertを追加します 集計演算子と$toString まさにそれを可能にするエイリアス:

    db.getCollection('example').aggregate([
      { "$match": { "example":1 } },
      { "$project": { "_id": { "$toString": "$_id" } } }
    ])
    

    主な使用法は、おそらく_idを使用することです。 ドキュメントの「キー」としての価値。

    db.getCollection('example').insertOne({ "a": 1, "b": 2 })
    
    db.getCollection('example').aggregate([
      { "$replaceRoot": {
        "newRoot": {
          "$arrayToObject": [
            [{ 
              "k": { "$toString": "$_id" },
              "v": {
                "$arrayToObject": {
                  "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "cond": { "$ne": ["$$this.k", "_id"] }
                  }
                }
              }
            }] 
          ]
        }
      }}
    ])
    

    どちらが返されますか:

    { 
      "5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
    }
    

    他の例と同様に、これは文字列を明確に示しています。

    通常、ドキュメントがサーバーから返されるときにカーソルを「変換」する方法があります。 ObjectIdなので、これは通常は良いことです は、より多くのスペースを必要とする24文字の16進「文字列」とは対照的に、12バイトのバイナリ表現です。

    シェルには.map()があります メソッド

    db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
    

    また、NodeJSにはCursor.map()があります これはほとんど同じことをすることができます:

    let cursor = db.collection('example').find()
        .map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
    
    while ( await cursor.hasNext() ) {
      let doc = cursor.next();
      // do something
    })
    

    また、同じ方法が他のドライバーにも存在します(PHPだけではありません)。または、カーソルを繰り返してコンテンツを変換することもできます。これが最善の方法です。

    実際、シェルで作業しているときに、カーソルを返すステートメントに追加するだけで、カーソル全体の結果を非常に簡単に1つのオブジェクトにまとめることができます

    .toArray().reduce((o,e) => { 
      var _id = e._id;
      delete e._id;
      return Object.assign(o, { [_id]: e })
    },{ })
    

    または、nodejsなどの完全なES6 JavaScriptサポート環境の場合:

    .toArray().reduce((o,({ _id, ...e })) =>  ({ ...o, [_id]: e }),{ })
    

    集約フレームワークで処理する必要があるものの複雑さのない、本当に単純なもの。そして、ほとんど同じ方法で、どの言語でも非常に可能です。



    1. django + PyMongoプーリングのベストプラクティス?

    2. MongoDBは、サブドキュメントの各キーを集計します

    3. mongodbで$andと$matchを使用する

    4. SpringdatamongoはクエリでORを使用します