MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Der Feldname "batchSize" wird in der Feldprojektion ignoriert

Sie haben Recht, dass der Treiber dies fälschlicherweise als batchSize interpretiert Option und ignoriert die Projektionsanweisung.

Der richtige Weg, dies in modernen Treiberversionen zu tun, besteht jedoch darin, tatsächlich .project() zu verwenden stattdessen "Cursor-Methode". Dies ist konsistenter mit anderen Sprachtreiberimplementierungen.

    db.collection('collection').find()
      .project({ name: 1, batchSize: 1})
      .toArray();

Als vollständige Demonstration:

const mongodb = require('mongodb'),
      MongoClient = mongodb.MongoClient;


(async function() {

  let db;

  try {
    db = await MongoClient.connect('mongodb://localhost/test');

    // New form uses .project() as a cursor method
    let result = await db.collection('collection').find()
      .project({ name: 1, batchSize: 1})
      .toArray();

    console.log(JSON.stringify(result,undefined,2));

    // Legacy form confuses this as being a legacy "cursor option"
    let other = await db.collection('collection')
      .find({},{ name: 1, batchSize: 1 })
      .toArray();

    console.log(JSON.stringify(other,undefined,2));

  } catch(e) {
    console.error(e)
  } finally {
    db.close()
  }

})()

Erzeugt die Ausgabe:

[
  {
    "_id": "594baf96256597ec035df23c",
    "name": "Batch 1",
    "batchSize": 30
  },
  {
    "_id": "594baf96256597ec035df234",
    "name": "Batch 2",
    "batchSize": 50
  }
]
[
  {
    "_id": "594baf96256597ec035df23c",
    "name": "Batch 1",
    "batchSize": 30,
    "users": []
  },
  {
    "_id": "594baf96256597ec035df234",
    "name": "Batch 2",
    "batchSize": 50,
    "users": []
  }
]

Wobei das erste Ausgabeformular das korrigierte ist, mit .project()