MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

nom de champ batchSize ignoré dans la projection de champ

Vous avez raison de dire que le pilote interprète incorrectement cela comme le batchSize option et ignore la déclaration de projection.

La bonne façon de procéder, bien que dans les versions de pilotes modernes, consiste à utiliser le .project() "méthode du curseur" à la place. Ceci est plus cohérent avec d'autres implémentations de pilotes de langage.

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

En guise de démonstration complète :

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

})()

Produit la sortie :

[
  {
    "_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": []
  }
]

Où le premier formulaire de sortie est celui corrigé, en utilisant .project()