使用 Mongoose 进行条件字段选择

cbn*_*bnz 3 mongoose mongodb

假设我有一组用户名和电子邮件地址。

{ name: 'John Doe', email: 'john@doe.com', level: 5 }
{ name: 'Fred Foo', email: 'fred@foo.com', level: 2 }
{ name: 'Jo Green', email: 'jo@green.com', level: 5 }
{ name: 'Paul Bar', email: 'paul@bar.com', level: 3 }
Run Code Online (Sandbox Code Playgroud)

我想查询这个集合,选择所有用户的名字和级别。在猫鼬,我可以这样做:

User
  .find()
  .select('name level')
  .exec(callback)
Run Code Online (Sandbox Code Playgroud)

这会给我以下内容:

{ name: 'John Doe', level: 5 }
{ name: 'Fred Foo', level: 2 }
{ name: 'Jo Green', level: 5 }
{ name: 'Paul Bar', level: 3 }
Run Code Online (Sandbox Code Playgroud)

但是如果用户的级别在 4 以上,我也想获取他们的电子邮件地址。这会给我以下内容:

{ name: 'John Doe', email: 'john@doe.com', level: 5 }
{ name: 'Fred Foo', level: 2 }
{ name: 'Jo Green', email: 'paul@bar.com', level: 5 }
{ name: 'Paul Bar', level: 3 }
Run Code Online (Sandbox Code Playgroud)

Mongo[ose] 的最佳选择是什么?

Wir*_*rie 5

不,MongoDb 目前没有任何方式可以在一个查询中根据条件有选择地返回不同的字段集。MongoDb 中的查询和关联的投影适用于所有文档。

map reduce 无法做到这一点(因为 map reduce 需要为每个文档返回相同的值)并且不适合。聚合不是许多查询的通用替代方案,并且有条件地返回字段会很复杂。

您有几个选择:

  1. 执行多个查询并合并结果。这将非常简单,因为每个结果都是一个数组,因此您可以合并这些数组。
  2. 在您的应用程序代码中返回所有字段和过滤器的超集。

我会测试选项的性能。两者都不复杂。