当前位置: 首页 > 面试题库 >

在Field Projection中忽略batchSize字段名称

呼延沈义
2023-03-14
问题内容

我有一个user_batch集合。它包含以下文档:

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

在查找查询中,我只想投影 namebatchSize
。但是,当我从nodejs执行find查询时,我会在查询结果中获取整个文档。查询:

db.collection('user_batch').find({}, {name: 1, batchSize: 1}).toArray((err, result) => {
  if(err) 
    console.log(err)
  else
    console.log(result)
})

如果我只是通过 {name:1}, 那么它将投影_id和名称。但是,如果我通过 batchSize ,它将返回整个文档。

注意:在Mongo Shell中执行此查询时,我没有遇到此问题


问题答案:

您正确地认为驱动程序将其错误地解释为batchSize选项,而忽略了projection语句。

尽管在现代驱动程序版本中,执行此操作的正确方法是实际使用.project()“游标方法”。这与其他html" target="_blank">语言驱动程序的实现更加一致。

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

作为完整的演示:

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

})()

产生输出:

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

如果第一个输出形式是更正的形式,则使用 .project()



 类似资料:
  • 问题内容: 有谁知道从INSERT查询中删除字段名称是否会带来一些性能改进? 我的意思是这样的: 比完成此任务更快地完成数据库: ? 我知道这可能是毫无意义的性能差异,但只是要知道。 我通常使用MySQL和PostgreSQL作为数据库。 问题答案: 不,实际上相反! 至少对于Microsoft SQL Server-您没有指定要使用的数据库..... 如果您未在SELECT或INSERT中指定字

  • 我使用的是Spring r2dbc和ReactiveCrudRepository,我有一个在生成更新查询时需要忽略的字段 如何在更新查询中忽略companyName。我可以在使用@列的插入查询中忽略它,但它不适用于更新

  • 问题内容: 我有一些必须序列化为JSON的数据。我正在使用JSON.NET。我的代码结构与此类似: 问题是,我的JSON输出需要具有ON OR 或ON- 取决于所使用的字段(即不为null)。默认情况下,我的JSON如下所示: 我知道我可以使用,但这给了我如下所示的JSON: 我需要的是: 有没有简单的方法可以做到这一点? 问题答案: 是的,您需要使用。 但是由于结构是值类型,因此您需要将Fiel

  • 我有一个搜索索引,包含一个名为的字段,它是一个数组。当我没有向查询中添加节时,标签值会出现在结果中,但当我添加了节时,它会被完全忽略,并且不会出现在结果中,如下所示。 这是否有原因或已知的问题?是ElasticSearch的某种保留词吗? 我使用的是ES版本1.1.2(Lucene 4.7)。

  • 问题内容: 在成功提交用户详细信息时,我从客户端获得了JSON。 由于未更新JSON中的某些元素,因此可以跳过。 在Go服务器端,我定义了一个等效的结构。 服务器成功将JSON字节编组到结构中。 但是对于未从客户端接收到的字段,默认情况下取消对字符串的硬编码解组为nil,对字符串数组解压缩为空数组。 例如,如果我获取json , 则不希望由元帅将其转换为。 简单起见,我希望它是 如何完全忽略该字段