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

时间:2014-07-21 20:25:41

标签: node.js mongodb mongoose

我有这个架构:

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

var Event = mongoose.model('Event', eventSchema);

一系列标签ID,例如:

var arrayOfTagsIds = [23, 55, 71];
 // in this example I'm not using real mongo id's, which are strings

如何使用mongoose的find来搜索任何这些标记的事件?

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

{
   _id: ...,
   name: 'Football tournament',
   tags: [{ tagId: 23, name: 'football', description: '' },
         { tagId: 55, name: 'tournament', description: '' }]
}

如何查询查找函数?

我正在考虑使用:tags.tagId: {$in: arrayOfTagsIds}但我认为这不会起作用(使用tags.tagId听起来不合适,因为tags是一个数组)

Event
.find({tags.tagId: {$in: arrayOfTagsIds}})
.exec(function (err, events) { ... }

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

1 个答案:

答案 0 :(得分:3)

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

Event
.find({'tags.tagId': {$in: arrayOfTagsIds}})
.exec(function (err, events) { ... }

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