【问题标题】:in mongodb, how to create a unique index for a list of documents?在 mongodb 中,如何为文档列表创建唯一索引?
【发布时间】:2022-11-29 04:19:58
【问题描述】:

我有一系列这样的文件:

[
  {
    _id: ObjectId("63845afd1f4ec22ab0d11db9"),
    ticker: 'ABCD',
    aggregates: [
      { date: '2022-05-20' },
      { date: '2022-05-20' },
      { date: '2022-05-20' }
    ]
  }
]

我如何在 aggregates.date 上创建唯一索引,这样用户就不会将重复的日期推送到数组聚合中。

我现有的聚合如下:

db.aggregates_1_day.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { ticker: 1 }, name: 'ticker_1', unique: true },
  {
    v: 2,
    key: { 'aggregates.date': 1 },
    name: 'aggregates.date_1',
    unique: true
  }
]

【问题讨论】:

    标签: mongodb indexing


    【解决方案1】:

    唯一索引确保文档之间没有重复,但不强制同一文档中的唯一性。

    但是您在这里几乎没有其他选择:

    1. 不要使用 $push ,而是使用 $addToSet 来在聚合中添加唯一对象:

       db.collection.update({},
       {
       "$addToSet": {
       "aggregates": {
        date: "2022-05-20"
         }
        }
      })
      

      注意:$addToSet 仅确保没有重复项添加到集合中,并且不影响现有的重复元素。

      Playground


      1. 您可以配置模式validation

        > db.runCommand({collMod:"aggregates_1_day", validator: {$expr:{$eq:[{$size:"$aggregates.date"},{$size:{$setUnion:"$aggregates.date"}}]}}})
        > db.aggregates_1_day.insert({aggregates:[{date:1}]}) /* success */
        > db.aggregates_1_day.update({},{ '$push' : { 'aggregates':{date:1}}})
        WriteResult({
         "nMatched" : 0,
         "nUpserted" : 0,
         "nModified" : 0,
         "writeError" : {
             "code" : 121,
             "errmsg" : "Document failed validation"
         }
        })
        > 
        

      更多细节在 mongoDB ticket

      注意:在这种方法中,您需要提前清除重复项,否则验证根本不允许 $push 新对象。

      要删除验证,您可以执行以下操作:

         db.runCommand({
           collMod: "admin",
           validator: {},
           validationLevel: "off"
         })
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-17
      • 2012-04-26
      • 2020-09-13
      • 1970-01-01
      • 2014-09-01
      • 2010-09-16
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多