节点mongodb 3.4使用带有指定字段和toArray的find不会过滤结果

时间:2018-11-21 18:59:10

标签: node.js mongodb mongodb-query

再次使用mongo v3.4并引用以下文档:https://docs.mongodb.com/v3.4/tutorial/project-fields-from-query-results/

我的示例如下:

    const m = this.getCollection(SOME_COLLECTION);
    m.find({
        '_id': {
            $nin: [Ace, Bay],
        },
        'value.someCategory': {
            $type: 'object',
        },
    }, {
        '_id': 0,
        'value.someCategory': 1,
    }).toArray((err, doc) => {
        if (err) {
            console.log(err);
        } else {
            console.log(doc);
        }
    });

我的doc数组将返回遵循我的value.someCategory类型的对象过滤器的所有项目,但不会删除_id并返回所有字段,即使我愿意仅指定value.someCategory字段。

mongo中的示例数据:

[
    {
      _id: 'hello',
      value: {
        someCategory: [Object],
        name: 'hello',
        otherCategory: true,
      }
    },
    {
      _id: 'Ace',
      value: {
        someCategory: [Object],
        name: 'Ace',
        otherCategory: true,
      }
    },
    {
      _id: 'testing',
      value: {
        someCategory: null,
        name: 'testing',
        otherCategory: true,
      }
    },
]

并且期望结果是:

[
    {
      someCategory: [Object],
    },
]

根据上面链接的文档,指定的字段应为第二个参数。我想知道现在使用toArray是否会影响返回值?

2 个答案:

答案 0 :(得分:1)

改为使用.project光标方法

db.collection('collection')
  .find({ '_id': { '$nin': [Ace, Bay] }, 'value.someCategory': { '$type': 'object' }})
  .project({ '_id': 0, 'value.someCategory': 1 })
  .toArray()

答案 1 :(得分:0)

使用选择功能并定义要投影的必填字段。

const m = await Model.find({
        '_id': {
            $nin: [Ace, Bay],
        },
        'value.someCategory': {
            $type: 'object',
        },
    }).select('-_id value.someCategory').lean();

console.log(m)