簡體   English   中英

MongoDB 用另一個集合中的另一個字段更新字段

[英]MongoDB update field with another field from another collection

我有兩個 collections:書籍和類別。 類別 collections 表示樹結構,使它們使用父級和子級嵌套類別。

這本書可以有多個類別並將它們存儲在一個數組中。

示例:圖書具有類別,我想將其停用並將其設置為父類別。

這就是類別集合的填充方式。

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})]}}
)

您可以使用此聚合管道獲得的父級:

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

要加入 collections,您必須使用$lookup運算符。 請記住,NoSQL 數據庫(如 MongoDB)未針對連接/查找進行優化。 在現實生活中,您應該尋找更好的設計。

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 } });
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM