首页 > 解决方案 > 查找枚举值列表的好方法是什么?

问题描述

我有一个case名为status(整数)的字段的集合,其有效值为 0、1、2、4 和 8,分别代表“新”、“WIP”、“已解决”、“已取消”和“已关闭”。

因此,在猫鼬语法中,它可能类似于:

const caseSchema = new Schema({
  createdOn: Date,
  subittedBy: String,
  status: Number,
  ...
});

const statusSchema = new Schema({
  value: Number,
  description: String
});

这是组织数据的好方法吗?如何使用status正确填充的字段进行查询以检索案例description

标签: mongodb

解决方案


这是确保做到这一点的一种方法。您可以使用$lookup进行查询。它看起来像这样:

db.getCollection('<YourCasesColName>').aggregate([
    { $match : { 'status' : 1 } }, // or { $in: [1,2,3] },
    {
      $lookup: {
        from: '<YourStatusColName>',
        localField: 'status',
        foreignField: 'value',
        as: 'statusDoc',
      }
    }
 ])

另一种方法是通过 ObjectId添加对实际状态的引用,这样您就可以存储对实际状态对象的引用而不是数字,从而具有更好的引用完整性。但是,您仍然需要进行类似的查询才能一次获得两者。所以这就是我所说的:

const caseSchema = new Schema({
  createdOn: Date,
  subittedBy: String,
  status: { type: mongoose.Schema.Types.ObjectId, ref: 'Status' },
  // ^ now your status hows reference to exactly the type of status it has
});

const statusSchema = new Schema({
  value: Number,
  description: String
});

So the actual data would look like this:

// Statuses
[{
  _id: <StatusMongoObjectID_1>,
  value: 1,
  description: 'New'
},{
  _id: <StatusMongoObjectID_2>,
  value: 2,
  description: 'New'
}]

// Cases
[{
  _id: <MongoObjectID>,
  createdOn: '<SomeISODate>',
  subittedBy: '<SomeString>',
  status: <StatusMongoObjectID_1>
},
{
  _id: <MongoObjectID>,
  createdOn: '<SomeISODate>',
  subittedBy: '<SomeString>',
  status: <StatusMongoObjectID_2>
}]

推荐阅读