【问题标题】:Max size of MongoDB array when using $addToSet使用 $addToSet 时 MongoDB 数组的最大大小
【发布时间】:2015-03-12 19:28:03
【问题描述】:

使用:

 db.collection('users').update(
     { "_id": user._id},
     { "$addToSet": { "keywords.RFD": keywords } },
     function(err, result) {
         if (err) {
             console.log(
               'failed to add keyword "%s" for user: %s', keywords, user.email);
                    throw err;
          }
          else {
              console.log('Keyword added: ' + keywords );
              res.end('{"success" : "Updated Successfully.", "status" : 200}');
          }
   }
);

我想将关键字的数量限制为50个,如果关键字超过50个就会抛出错误。如果数据库中已经有50个,我可以用MongoDB检查吗?

【问题讨论】:

  • 这是和“更新”声明。上次我检查时,编写代码的人控制了逻辑。检查keywords 的长度。你的错。不要依赖数据库来纠正错误。
  • 如何查看关键字的长度?
  • 你有点不需要。只需检查结果数组的长度。我在我给出的答案中解释了它。

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:
const MAX_KEYWORDS = 50;
const maxArrayPath = `keywords.RFD.${MAX_KEYWORDS - 1}`;

db.collection('users').updateOne(
  { _id: user._id,
    [maxArrayPath]: { $exists: false }
  },
  { 
    $addToSet: { 
      "keywords.RFD": keywords,
    }
  }
);

【讨论】:

    【解决方案2】:

    告诉你什么。您没有正确阅读文档。所以keywords 在这里是一个“用词不当”,因为它在这种情况下只能是一个单数字符串或其他对象。当然不是数组。

    但是是的 MongoDB 有办法处理这个问题。正如我给出的指示,您需要阅读$each 文档以及other modifiers

    db.collection('users').update(
      { "_id": user._id},
      { 
        "$addToSet": { 
          "keywords.RFD": {
             "$each": [keywords],
          }
      }
    )
    

    然后,您实际上可以调用一个单独的更新语句来调用$slice,并对$each 进行空白调用。这很有趣,效果很好。

    db.collection('users').update(
      { "_id": user._id},
      { 
        "$push": { 
          "keywords.RFD": {
             "push": {"$each": [] },
          },
          "$slice": -50
      }
    )
    

    这里的主键修饰符是$slice,这是一种“限制”数组大小的形式。

    请注意,您需要 MongoDB 2.6 或更高版本作为服务器版本,这些运算符才能在更新时生效。不过,如果您需要这种互动,这是一个令人信服的升级理由。

    附:正如我之前所说,您示例中“关键字”的上下文是“用词不当”,因为它是“标量”值。在$each 修饰符下,这确实可以是一个数组。因此:

    db.collection('users').update(
      { "_id": user._id},
      { 
        "$addToSet": { 
          "keywords.RFD": {
             "$each": { "$each: keywords },
          }
      }
    )
    db.collection('users').update(
      { "_id": user._id},
      { 
        "$push": { 
          "keywords.RFD": {
             "push": [],
          },
          "$slice": -50
      }
    )
    

    不是原子的。但尽可能接近,尤其是在使用 Bulk API 时。

    【讨论】:

      【解决方案3】:

      我认为也许有一种方法可以使用 MongoDB 对数组本身添加一个严格的限制,就像一个有上限的数组,但我认为这是不可能的。我最终只是使用逻辑。

      if (user.settings.max_keywords <= result.keywords.RFD.length){
              res.end('{"error" : "Too many keywords.", "status" : 401}');
            }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2010-10-24
        • 1970-01-01
        • 2012-04-06
        • 1970-01-01
        相关资源
        最近更新 更多