当前位置: 首页 > 知识库问答 >
问题:

MongoDB-用子文档更新/替换数组字段以嵌入其内容

丌官开宇
2023-03-14
db.events.insertMany([{
    "_id" : ObjectId("5f6c5b0594911c0b7231643d"),
    "title" : "Test Event",
    "tags" : [ 
        "5fd8cef2368c625a9d7516cb"
    ]
},
{
    "_id" : ObjectId("5fb3896afc13ae2ed1000000"),
    "title" : "Test Event 2",
    "tags" : [ 
        "5fd8cef2368c625a9d7516cb", 
        "5fd8cfb04a4a6063ab4ca4bf", 
        "5fd8cfb04a4a6063ab4ca4c0"
    ]
}
]);
db.tags.insertMany([{
    "_id" : ObjectId("5fd8cef2368c625a9d7516cb"),
    "name" : "Foo",
    "createdAt" : ISODate("2020-12-15T14:57:54.096Z")
},
{
    "_id" : ObjectId("5fd8cfb04a4a6063ab4ca4bf"),
    "name" : "Bar",
    "createdBy" : "embo@team-con.de",
    "createdAt" : ISODate("2020-12-16T14:57:54.096Z")
},
{
    "_id" : ObjectId("5fd8cfb04a4a6063ab4ca4c0"),
    "name" : "Foobar",
    "createdAt" : ISODate("2020-12-17T14:57:54.096Z")
}
]);
{
    "_id" : ObjectId("5f6c5b0594911c0b7231643d"),
    "title" : "Test Event",
    "tags" : [{
        "_id" : ObjectId("5fd8cef2368c625a9d7516cb"),
        "name" : "Foo",
        "createdAt" : ISODate("2020-12-15T14:57:54.096Z")
    }]
},
{
    "_id" : ObjectId("5fb3896afc13ae2ed1000000"),
    "title" : "Test Event 2",
    "tags" : [{
        "_id" : ObjectId("5fd8cef2368c625a9d7516cb"),
        "name" : "Foo"
    },
    {
        "_id" : ObjectId("5fd8cfb04a4a6063ab4ca4bf"),
        "name" : "Bar"
    },
    {
        "_id" : ObjectId("5fd8cfb04a4a6063ab4ca4c0"),
        "name" : "Foobar"
    }]
}

婴儿步

我尝试使用聚合管道,并在最后一步中通过匹配和查找它们的内容来替换。我不太熟悉通过聚合管道解决这个问题。

db.getCollection('events').aggregate([
    { $match: { tags: { "$exists" : true } } },
    {
       $lookup:
         {
           from: "tags",
           localField: "tags",
           foreignField: "_id",
           as: "taags"
         }
    },
    ])

共有1个答案

澹台举
2023-03-14

您可以使用$toobjectid运算符在$lookup阶段之前将标记的id从string转换为objectId,

  • $addfields添加新字段并更新/格式化现有字段
  • $map循环迭代标记数组
  • $toobjectid将字符串objectId转换为objectId类型
  • 将名称标记放在中,作为$lookup阶段
  • 属性
  // $match stage here
  {
    $addFields: {
      tags: {
        $map: {
          input: "$tags",
          in: { $toObjectId: "$$this" }
        }
      }
    }
  },
  {
    $lookup: {
      from: "tags",
      localField: "tags",
      foreignField: "_id",
      as: "tags"
    }
  }

操场

    null
  { $out: "updated_events" }
    null
 类似资料:
  • 我正在尝试使用Spring Data mongodb更新mongodb中嵌入文档中的数组字段。 我想在mongodb集合中更新/插入的文档结构如下所示。 可以有更多这样的文档基于每个类型的部门,如“销售”,“市场营销”等。 即使这样做有效,我也不确定在Spring Data MongoDB中实现相同的功能是否有类似的支持。 另外,我的另一个查询是,如果我想为多个部门添加/更新员工,比如“Accou

  • 问题内容: 我正在使用MongoDB数据库,该数据库的收集模型包括 班级 , 学生 , 学科 和[学术] 表现 。以下是基于猫鼬的架构和模型: 该集合的文件是最复杂的地段; 示例文档为: 我能够使用以下代码检索现有的班级文档并将其添加到分数中: 但是,如何添加/更新/删除该特定学生的成绩?我需要能够通过以下方式与集合进行交互: 检索所有学生或特定学生的分数(检索数组中的特定元素) 为特定主题添加/

  • 我有一个类似这样的mongoDocument结构,注释字段作为嵌入文档。 我想添加 “newField” : “something” 到 嵌入的注释字段中 “cid” : “17426944” : 在java驱动程序中,我尝试了: 这里的问题是: 示例文档: 我需要什么 : 请帮帮我,谢谢vijay

  • 我有一个深度嵌套的文档结构,如下所示: 我正在尝试更新集合以插入新配置,如下所示: 我正在mongo(Python)中尝试类似的内容: 但是,我得到了“如果没有包含数组的相应查询字段,则无法应用位置运算符”错误。在mongo这样做的正确方式是什么?这是mongo v2。4.1.

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 问题内容: 我的文档中具有以下结构: 我想更新 someField 和 someField2, 但仅更新数组中的一项,与 _arrayId 匹配的 项 (例如;并且仅针对此文档(例如)),而不更新其他项。 该 arrayIds 是不是唯一的,这就是为什么我需要它是针对特定文档的文档。如果要为数组中存在的每个文档更新该值,则可以使用,但这不是我想要的。 我试图在Java中完成此操作,但也可以使用命令