Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB更新字段与另一个集合中的另一个字段_Mongodb_Collections_Nosql - Fatal编程技术网

MongoDB更新字段与另一个集合中的另一个字段

MongoDB更新字段与另一个集合中的另一个字段,mongodb,collections,nosql,Mongodb,Collections,Nosql,我有两个收藏:书籍和分类。类别集合表示一个树结构,使它们使用父级和子级嵌套类别 这本书可以有多个类别,并将它们存储在一个数组中 示例:Book有一个类别,我想取消它并将其设置为父类别 这就是类别集合的填充方式 db.categories.insertMany([ { _id: "Space Opera", ancestors: ["Science Fiction", "Fiction", "Science

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

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

示例:Book有一个类别,我想取消它并将其设置为父类别

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

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  
我相信我可以在书中使用上面的代码。更新

我可以将其存储在一个单独的变量中,但在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
要加入集合,必须使用运算符。请记住,像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 } });
})

回答得很好,我不明白你的问题。代码应该满足您的要求。
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 } });
})