【问题标题】:MongoDB update field with another field from another collectionMongoDB 使用另一个集合中的另一个字段更新字段
【发布时间】:2021-03-10 06:59:59
【问题描述】:

我有两个收藏:书籍和类别。类别集合表示一个树结构,使它们使用父级和子级嵌套类别。

这本书可以有多个类别并将它们存储在一个数组中。

示例:图书有类别,我想将其停用并将其设置为父类别。

这就是类别集合的填充方式。

db.categories.insertMany([
  {
    _id: "Space Opera",
    ancestors: ["Science Fiction", "Fiction", "Science Fiction & Fantasy"],
    parent: ["Science Fiction"],
  },
  {
    _id: "Dystopian",
    ancestors: ["Science Fiction", "Fiction", "Science Fiction & Fantasy"],
    parent: ["Science Fiction"],
  },
  {
    _id: "Cyberpunk",
    ancestors: ["Science Fiction", "Fiction", "Science Fiction & Fantasy"],
    parent: ["Science Fiction"],
  },
  {
    _id: "Science Fiction",
    ancestors: ["Fiction", "Science Fiction & Fantasy"],
    parent: ["Fiction", "Science Fiction & Fantasy"],
  },
  {
    _id: "Fantasy",
    ancestors: ["Science Fiction & Fantasy"],
    parent: ["Science Fiction & Fantasy"],
  },
  {
    _id: "Science Fiction & Fantasy",
    ancestors: [],
    parent: [],
  },
  {
    _id: "Fiction",
    ancestors: [],
    parent: [],
  },
]);

另外,我如何查询这个并只获取值“科幻小说”(注意它存储在一个数组中)?

db.categories.find({_id : "Space Opera"}, {_id : 0, parent : 1})[0].parent // Did not work  

db.categories.find({_id : "Space Opera"}, {_id : 0, parent : 1}) // find parent

// result 

[
  {
    "parent": [
      "Science Fiction"
    ]
  }
]
db.books.update(
    {title : "Book1"}, 
    {$set : {category : [**PARENT CATEGORY**]}}
)

我相信我可以在 books.update() 中使用上面的代码

我可以将它存储在一个单独的变量中,但在 vscode 中它给了我未定义的。 内部查询并没有像前面所说的那样给我正确的值,但我想你明白了。

db.books.update(
    {title : "Book1"}, 
    {$set : {category : [db.categories.find({_id : "Space Opera"}, {_id : 0, parent : 1})]}}
)

【问题讨论】:

    标签: mongodb collections nosql


    【解决方案1】:

    您可以通过此聚合管道获得父级:

    db.categories.aggregate([
       { $match: { _id: "Space Opera" } },
       { $project: { _id: 0, parent: { $first: "$parent" } } }
    ])
    

    甚至

    db.categories.aggregate([
       { $match: { _id: "Space Opera" } },
       { $project: { _id: 0, parent: { $first: "$parent" } } }
    ]).toArray().shift().parent
    

    要加入集合,您必须使用$lookup 运算符。请记住,像 MongoDB 这样的 NoSQL 数据库并未针对连接/查找进行优化。在现实生活中,您应该寻找更好的设计。

    db.books.aggregate([
       { $match: { title: "Book1" } },
       {
          $lookup:
             {
                from: "categories",
                pipeline: [
                   { $match: { _id: "Space Opera" } },
                   { $project: { _id: 0, parent: { $first: "$parent" } } }
                ],
                as: "category"
             }
       },
       { $set: { category: { $first: "$category.parent" } } }
    ])
    

    如果你想更新现有的集合,那么你必须为它创建一个循环:

    db.books.aggregate([...]).forEach(function (doc) {
       db.books.updateOne({ _id: doc._id }, { $set: { category: doc.category } });
    })
    

    【讨论】:

    • 我不明白你的问题。代码应该做你所要求的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多