【问题标题】:update one element of array of objects in mongodb更新 mongodb 中对象数组的一个元素
【发布时间】:2021-11-04 12:49:08
【问题描述】:

我有以下文件:

{
  _id: ObjectId('111111111111111111114444'),
  books: [
    {
      id: ObjectId('111111111111111111113333'),
      pictures: []
    },
    {
      id: ObjectId('111111111111111111112222'),
      pictures: []
    }
  ],
  // others attributes
}

我需要做的是向pictures 添加一个元素。请记住,我有 documentId 是文档的 ID,bookIdbooks 元素的 ID。

如果我想将元素 {description: "nice picture"} 添加到 1111111111111111111113333 书中的文档 111111111111111111114444 中,更新后的文档将如下所示

{
  _id: ObjectId('111111111111111111114444'),
  books: [
    {
      id: ObjectId('111111111111111111113333'),
      pictures: [
        {
          description: "nice picture"
        }
      ]
    },
    {
      id: ObjectId('111111111111111111112222'),
      pictures: []
    }
  ],
  // others attributes
}

【问题讨论】:

  • 澄清一下,您的图书收藏有一个 _id?
  • 书籍是一个对象数组,是的,它们有一个 id

标签: arrays mongodb mongodb-query aggregation-framework


【解决方案1】:

查询

  • 管道更新需要 MongoDB >= 4.2
  • 过滤“_id”
  • 如果id=2 合并对象,则在书籍上映射,图片包含新元素
  • 否则id=2不要换本书

*我使用 1,2,3 作为 ids(代码相同)

Test code here

update({"_id" : 1},
[{"$set": 
   {"books": 
     {"$map": 
       {"input": "$books",
        "in": 
        {"$cond": 
          [{"$eq": ["$$book.id", 2]},
           {"$mergeObjects": 
             ["$$book",
               {"pictures": 
                 {"$concatArrays": 
                   ["$$book.pictures", [{"description": "nice picture"}]]}}]},
           "$$book"]},
        "as": "book"}}}}])

编辑

查询

  • 如果图片不是数组(或不存在),则创建一个空数组

Test code here

update({"_id" : 1},
[{"$set": 
    {"books": 
      {"$map": 
        {"input": "$books",
          "in": 
          {"$cond": 
            [{"$eq": ["$$book.id", 2]},
              {"$mergeObjects": 
                ["$$book",
                  {"pictures": 
                    {"$concatArrays": 
                      [{"$cond": 
                          [{"$isArray": ["$$book.pictures"]}, "$$book.pictures",
                            []]},
                        [{"description": "nice picture"}]]}}]},
              "$$book"]},
          "as": "book"}}}}])

【讨论】:

  • 如果还没有数组怎么办?它会使 concatArrays 为空,而另一个数组可能会变成空。我们不能使 $concatArrays 未定义。我该如何解决这个问题?我尝试使用 $push 但由于某种原因它不接受它..
  • 我已针对这种情况进行了更新,但如果您有特殊的架构情况,请在问题中询问它们,因为答案基于您发送的图片始终为数组的架构。
  • 我为我的错误道歉。谢谢
  • 不用担心,主要是为了您获得更好的答案
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2022-01-22
  • 2019-04-29
相关资源
最近更新 更多