MongoDB:如何从数组中获取和删除第一个值?如何获取和删除最后一个



例如,如果我有文档:

{
_id: 1,
items: ["aaa", "bbb", "ccc", "ddd", "eee"]
}

假设我想要第一个元素,那么我当然会返回"aaa",更新后的文档将是:

{
_id: 1,
items: ["bbb", "ccc", "ddd", "eee"]
}

我意识到有$pop,它将分别删除第一个或最后一个元素,这取决于使用的参数是-1还是1,但我还没有找到一种方法来实际返回这个值

同样,我也在寻找一种方法来弹出最后一个元素并返回其值

我希望能够用一个命令/没有任何并发问题来做到这一点。。。即,我不希望用一个命令来获取第一个元素,然后用另一个命令删除第一个元素。因为在原始实例删除之前,另一个实例可能会获得相同的值

另外,有人知道删除第一个元素和最后一个元素在性能上是否存在差异吗?因为,在许多(所有?(编程语言中,从数组中删除第一个元素是O(n(,而删除最后一个元素应该是O(1(。。。所以我想知道从Mongo数组中"弹出"第一个元素是否会比弹出最后一个慢?

查看

// select some random mongo database for testing
use("stack")
// at first, clean collection
db.data.drop()
// populate with initial data
db.data.insertMany([
{
_id: 1,
items: ["aaa", "bbb", "ccc", "ddd", "eee"]
}
])
// which element do we want to remove, first or last
first_or_last = "first"
db.data.findOneAndUpdate(
// match filter | in real case we should also have array length stored
{_id: 1},
// update query
{ $pop: {"items": {"last": 1, "first": -1}[first_or_last] } },
// options
{  // return popped array element | use $last if in $pop value is 1, $first otherwise
projection: {popped_element: {[`$${first_or_last}`]: "$items"}, _id: 0},
}
)
// db.data.find()

去除";第一个";元件

{
"popped_element": "aaa"
}

运行.find((后

[
{
"_id": 1,
"items": [
"bbb",
"ccc",
"ddd",
"eee"
]
}
]

最新更新