我有一个库文档,如下所示:
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',
}
]
}
答案 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"
}
]
}
>