在猫鼬中索引数组项

时间:2019-06-10 22:16:54

标签: javascript node.js mongodb mongoose

我有一个看起来像...的架构

const itemSchema = new Schema({
    sizes: [{
        type: String,
        enum: [/* some fixed sizes */],
    }],
    // other properties ...
});

我以Items.find({ sizes: { $elemMatch: 'someSize' } });的形式执行查询
因此,我想向元素内部的这些大小添加索引,以便快速执行查询。

应该是这样的:

const itemSchema = new Schema({
    sizes: [{
        type: String,
        enum: [/* some fixed sizes */],
        index: true,
    }],
    // other properties ...
});

const itemSchema = new Schema({
    sizes: {
        type: [{
            type: String,
            enum: [/* some fixed sizes */],
        }],
        index: true,
    },
    // other properties ...
});

还是第三个选择?

4 个答案:

答案 0 :(得分:1)

您可以像这样在类型声明中定义indexes

const itemSchema = new Schema({
    sizes: [{
        type: String,
        enum: ['foo', 'bar'],
        index: true,
    }],
    // other properties ...
});

您也可以通过如下方式将它们定义为@Eduardo提述:

itemSchema.index({ _id: 1 }, { sparse: true });

所有内容都在documentation中。

答案 1 :(得分:0)

我为索引所做的是: 在模式下方,我将写itemSchema.index({'sizes':1}); 您可以在此处查看猫鼬文档以获取更多信息 https://mongoosejs.com/docs/guide.html#indexes

答案 2 :(得分:0)

我发现我想要的被称为 Multikey Indexing (多键索引编制),并且在MongoDB上找到了它的文档。

因此,对一个类型为数组的字段建立索引将为所有指向同一文档的数组每个字段创建索引,这正是我要优化查询的目的。

所以正确的答案应该是

const itemSchema = new Schema({
    sizes: {
        type: [{
            type: String,
            enum: [/* some fixed sizes */],
        }],
        index: true,
    },
    // other properties ...
});

但是在尝试和检查集合索引(使用指南针)时,我发现了

const itemSchema = new Schema({
    sizes: [{
        type: String,
        enum: [/* some fixed sizes */],
        index: true,
    }],
    // other properties ...
});

也将以相同的方式工作,并将在sizes字段上创建索引,该索引将成为多键索引。

几乎可以接受这两种形式,并且可以按预期工作;我更喜欢这样一个显式索引sizes字段的字段。

答案 3 :(得分:0)

扩展@Amr Saber和@Akrion的答案,
如果有人还想要定义默认值或必需值

const itemSchema = new Schema({
    sizes: [{ 
      type: [{
         type: String,
         enum: [/* some fixed sizes */],
         index: true,
      }],
      required: true, 
      default: [] 
    }],
    // other properties ...
});
可以使用

。对我来说似乎很好。