使用猫鼬在数组字段的对象内查找匹配项

spo*_*rts 2 mongoose mongodb node.js

我有这个架构:

var eventSchema = new mongoose.Schema({
    name: String,
    tags: [{
        tagId: mongoose.Schema.Types.ObjectId,
        name: String,
        description: String
    }],
});

var Event = mongoose.model('Event', eventSchema);
Run Code Online (Sandbox Code Playgroud)

以及一系列标签 ID,例如:

var arrayOfTagsIds = [23, 55, 71];
 // in this example I'm not using real mongo id's, which are strings
Run Code Online (Sandbox Code Playgroud)

我如何使用猫鼬的查找来搜索该事件有任何这些标签的?

例如,这个事件应该在结果中,因为它有 tagId 23 和 tagId 55:

{
   _id: ...,
   name: 'Football tournament',
   tags: [{ tagId: 23, name: 'football', description: '' },
         { tagId: 55, name: 'tournament', description: '' }]
}
Run Code Online (Sandbox Code Playgroud)

find 函数中的查询必须如何?

我正在考虑使用:tags.tagId: {$in: arrayOfTagsIds}但我认为这行不通(使用听起来不太好tags.tagId,因为它tags是一个数组)

Event
.find({tags.tagId: {$in: arrayOfTagsIds}})
.exec(function (err, events) { ... }
Run Code Online (Sandbox Code Playgroud)

另外,做这种查询是不是太慢了?

Joh*_*yHK 5

是的,您可以在嵌入的子文档和数组的键中使用点表示法。但是,您确实需要引用您的密钥,因为它包含一个点:

Event
.find({'tags.tagId': {$in: arrayOfTagsIds}})
.exec(function (err, events) { ... }
Run Code Online (Sandbox Code Playgroud)

要加速此查询,您可以在 上创建索引'tags.tagId'