【问题标题】:Mongoose : query on a field on an array of ref documents, [duplicate]Mongoose:查询参考文档数组上的字段,[重复]
【发布时间】:2015-10-04 06:06:18
【问题描述】:

这是我的模型:

var LocationSchema = new Schema(
{
    events: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Event'
        }
    ]
})
var EventSchema = new Schema(
{
    title  : String,

    location: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Location'
    }
})

我想从 Location 模型中查询 Event 模型中的一个字段。

下面的不行

findOne({events: {$elemMatch: {title: 'test'}}})

我什至不确定这是否可能......

【问题讨论】:

  • 不可能,这就是你使用 emedding 的原因。文档中的某处显示使用 .filter()
  • 谢谢你们,我已经完成了填充,但是请求所有文档并在之后过滤并不是太贪心?
  • 当您在 Event 模型/集合中查找某些内容时,为什么要从 Location 进行查询?
  • @robertklep 因为我的 Location 模型中有我想选择的字段

标签: node.js mongodb mongoose


【解决方案1】:

当您使用引用时,您可以使用population 对引用的文档运行“子查询”以选择应包含哪些文档。

Location.find({ ... }).populate({
  path  : 'events',
  match : { title : 'test' }
}).exec(...);

哪种方式(查询Location 并填充Event,或相反)取决于您需要运行的确切查询。在产生最少结果的模型上运行“主”查询是最高效的。

此方法仍将返回与主查询匹配的所有文档,您必须执行一些后处理来过滤没有任何匹配事件引用的文档。

【讨论】:

  • 如何在不编写两个查询的情况下以另一种方式查询(如果您对位置的选择标准很少)?
猜你喜欢
  • 2023-03-04
  • 2019-08-04
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2013-07-15
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多