首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字段投影中忽略的batchSize字段名

字段投影中忽略的batchSize字段名
EN

Stack Overflow用户
提问于 2017-07-14 08:55:04
回答 2查看 794关注 0票数 4

我有一个user_batch系列。它载有下列文件:

代码语言:javascript
复制
[{
  _id: ObjectId("594baf96256597ec035df23c"),
  name: "Batch 1",
  batchSize: 30,
  users:[]
 },
 {
  _id: ObjectId("594baf96256597ec035df234"),
  name: "Batch 2",
  batchSize: 50,
  users:[]
 }]

在查找查询中,我希望只投影名称batchSize。但是,当我从nodejs执行find查询时,我将得到查询结果中的整个文档。查询:

代码语言:javascript
复制
db.collection('user_batch').find({}, {name: 1, batchSize: 1}).toArray((err, result) => {
  if(err) 
    console.log(err)
  else
    console.log(result)
})

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 09:17:25

正确的是,驱动程序错误地将其解释为batchSize选项,并忽略了投影语句。

在现代驱动程序版本中,正确的方法是实际使用.project()“游标方法”。这与其他语言驱动程序实现更加一致。

代码语言:javascript
复制
    db.collection('collection').find()
      .project({ name: 1, batchSize: 1})
      .toArray();

作为一次充分的示范:

代码语言:javascript
复制
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()
  }

})()

产生的输出:

代码语言:javascript
复制
[
  {
    "_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()

票数 11
EN

Stack Overflow用户

发布于 2018-05-31 14:16:35

Find的语法发生了变化。下面是我需要知道的来解决这个问题。这是从https://github.com/mongodb/node-mongodb-native/blob/master/CHANGES_3.0.0.md#find摘录的。

发现

findfindOne不再支持fields参数。您可以通过使用fields或在options对象上传递projection属性来实现与projection参数相同的结果。此外,find不支持单独的选项,如skiplimit作为位置参数。您必须在options对象中传入这些参数,或者通过Cursor方法(如Cursor.prototype.skip )添加它们。

2.x语法:

代码语言:javascript
复制
const cursor = coll.find({ a: 42 }, { someField: 1 });

3.x语法:

代码语言:javascript
复制
const cursor = coll.find({ a: 42 }).project({ someField: 1 });

/* OR */

const cursor = coll.find({ a: 42 }, { projection: { someField: 1 } });
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45098742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档