MongoDB $从单个.updateOne()中的对象数组和数组内的多个对象数组中拉出

时间:2016-11-29 21:26:42

标签: mongodb

我有一个库文档,如下所示:

library: {
  '_id': ObjectId("58380bd7ae1d7b1278dbb79f"),
  'shelves': [
    { 
      'type': 'sci-fi',
      'bookshelf': 1,
      'books': [ ObjectId("583817c043bf901f2c8ff2ce"), ObjectId("583817c043bf901f2c8ff2d1")]
    }
  ],
  'books': [
     {
       '_id': ObjectId("583817c043bf901f2c8ff2ce"),
       'title': 'Lorem',
       'author': 'Foo Bar',
     },
     {
       '_id': ObjectId("583817c043bf901f2c8ff2d1"),
       'title': 'Ipsum',
       'author': 'Dolor Sit',
     }
  ]
}

问题$pull来自library.books的单本图书以及单library.shelves.books中包含该图书的每个updateOne()是否都可以({1}}或任何其他方法)没有重组的电话?假设会有很多书架,其中很多书都可以出书。

现在我正在两个单独的电话中这样做,所以想知道它是否可以更有效地完成。

修改

让我们说我想要上面例子$pull编辑的第一本书。然后,我的库看起来像:

library: {
  '_id': ObjectId("58380bd7ae1d7b1278dbb79f"),
  'shelves': [
    { 
      'type': 'sci-fi',
      'bookshelf': 1,
      'books': [ ObjectId("583817c043bf901f2c8ff2d1")]
    }
  ],
  'books': [
     {
       '_id': ObjectId("583817c043bf901f2c8ff2d1"),
       'title': 'Ipsum',
       'author': 'Dolor Sit',
     }
  ]
}

1 个答案:

答案 0 :(得分:1)

你可以在一次更新中结合2 $pull,一个用于从货架中取出物品,另一个用于从书本中取出物品:

> db.library.update({"shelves.books" : ObjectId("583817c043bf901f2c8ff2ce")},
...     {
...         $pull: {
...             "shelves.$.books" : { $in : [ObjectId("583817c043bf901f2c8ff2ce")] },
...             "books" : { "_id" : ObjectId("583817c043bf901f2c8ff2ce")}
...         }
...     })

将返回

> db.library.find().pretty()
{
        "_id" : ObjectId("58380bd7ae1d7b1278dbb79f"),
        "shelves" : [
                {
                        "type" : "sci-fi",
                        "bookshelf" : 1,
                        "books" : [
                                ObjectId("583817c043bf901f2c8ff2d1")
                        ]
                }
        ],
        "books" : [
                {
                        "_id" : ObjectId("583817c043bf901f2c8ff2d1"),
                        "title" : "Ipsum",
                        "author" : "Dolor Sit"
                }
        ]
}
>