如何在不使用Unique索引的情况下基于特定fieldin数组维护唯一性

时间:2016-12-16 06:28:10

标签: mongodb mongodb-query

我有这样的文件。

[{
    "_id" : ObjectId("aaa"),
    "host": "host1",
    "artData": [
    {
        "aid": "56004721",
        "accessMin": NumberLong(1481862180
    },
    {
        "aid": "56010082",
        "accessMin": NumberLong(1481861880)
    },
    {
        "aid": "55998802",
        "accessMin": NumberLong(1481861880)
    }
    ]
},
{
    "_id" : ObjectId("bbb"),
    "host": "host2",
    "artData": [
    {
        "aid": "55922560",
        "accessMin": NumberLong(1481862000)
    },
    {
        "aid": "55922558",
        "accessMin": NumberLong(1481861880)
    },
    {
        "aid": "55940094",
        "accessMin": NumberLong(1481861760)
    }
    ]
}]

在更新任何文档时,不应在数组中再次添加重复的“aid”。 我得到的一个选项是在artData.aid字段上使用唯一索引。但建设索引不是首选,因为我不需要它根据要求。 有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

选项1:在为该文档设计Schema时使用unique:true。 例如:

var newSchema = new Schema({
 artData: [
    {
        aid: { type: String, unique: true },
        accessMin: Number
    }]
});
module.exports = mongoose.model('newSchema', newSchema );

选项2:refer a link to avoid duplicate

答案 1 :(得分:0)

根据this doc,您可以使用多键索引,如下所示:

{ "artData.aid": 1 }

话虽如此,因为你想要使用多键索引,插入的另一个选择是

  1. 查询文档以查找与artData's
  2. 匹配的aid
  3. 将结果集与您要插入的集合区分开来
  4. 删除与您的查询匹配的项目
  5. 插入第2步中的其余项目
  6. 理想情况下,您从步骤1开始的查询不会返回太大的集合 - 这使得操作速度惊人。也就是说,它实际上是基于您假设将尝试插入的重复数量。如果数字真的很高,那么步骤1中的查询结果可能会返回一大组项目,在这种情况下,这个解决方案可能不合适,但我得到的就是你所有的东西=(。

    我的建议是真正重新评估不使用多键索引的原因