【问题标题】:Mongo array update or push in one queryMongo 数组更新或推送一个查询
【发布时间】:2017-04-06 16:00:36
【问题描述】:

假设我们有 mongo 集合,其中包含以下形状的文档:

 {
   _id: '1234',
   letters: ['a', 'b', 'c', 'd'],
 }

但有时letters 字段可能是null

我想知道是否可以在 SINGLE 查询中实现以下目标

  • 如果letters 数组不为空,则将第一项设置为“x”。
  • 否则,将letters 字段设置为['x']

当然,最简单的想法是行不通的

db.collection.update({_id: '...'}, {$set:{'letters.0':'x'}});

因为如果尚未设置letters 字段,上述操作的结果将是:

{
  // ...
  letters: {
    '0': 'x'
  }
}

有没有办法告诉 mongo 我的意图是创建一个数组,而不是一个对象?

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    您可以使用$push 运算符,如果您关心数组上的重复项,则可以使用$addToSet

    您的查询将如下所示:

    db.collection.update({_id: '...'}, {$push:{'letters':'x'}});
    db.collection.update({_id: '...'}, {$addToSet:{'letters':'x'}});
    

    【讨论】:

    • 当然,但我想如果我已经有几个元素并且我只想更新第一个元素,那它就行不通了。
    • 哦,现在我得到了你的问题,你想更新指定的位置,或者创建数组。这就是为什么您将 $set 运算符放在您的问题上。查看文档:docs.mongodb.com/manual/reference/operator/update-array 我找不到运算符,$ - docs.mongodb.com/manual/reference/operator/update/positional 提到“不要将位置运算符 $ 用于 upsert 操作,因为插入将使用 $ 作为插入文档中的字段名称。 ”。这与你描述的行为相同,所以我认为你不能用一个命令来做到这一点。
    【解决方案2】:

    如果要更新数组中的第一个

    弹出旧的第一个

    db.collection.update({_id:xx}, {$pop:{letters : -1}})
    

    然后推到第一个

    db.collection.update({_id:xx}, {$push:{letters : {$each:['first one'], $position:0}}})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 2016-02-25
      • 2014-07-29
      相关资源
      最近更新 更多