Mongoose:在一个引用文档数组的字段上进行查询

5

这是我的模型:

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

我不确定是否有可能将其实现...


这是不可能的,这就是为什么你要使用嵌入而不是。文档中有一个部分展示了如何使用.filter() - Blakes Seven
谢谢大家,我已经使用populate了,但请求所有文档并在过滤后再进行处理可能有些过于贪心了吧? - GuillaumeC
当你在寻找事件模型/集合内的内容时,为什么要从位置查询? - robertklep
@robertklep 因为我在我的位置模型中有一些字段也想要选择。 - GuillaumeC
1个回答

6

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

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

查询位置(Location)并填充事件(Event),或者反过来,取决于您需要运行的确切查询。在产生最少结果的模型上运行“主”查询是最有效的。

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


1
如果您在位置上有几个选择标准,而不想编写两个查询,您该如何查询另一种方式? - user1767316

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接