数组操作
添加元素
如果数组已经存在,”$push” 会向已有的数组末尾加入一个元素,要是没有就
创建一个新的数组。例如,假设要存储博客文章,要添加一个用于保存数组的
“comments”(评论)键。可以向还不存在的”comments” 数组添加一条评论,这
个数组会被自动创建,并加入一条评论
db.blog.findOne()
{
"_id" : ObjectId("55a41686b8c3e684af6d4ce1"),
"title" : "tets",
"content" : "asfasf",
"comments" : [
{
"id" : 1
}
]
}
> db.blog.update({
"_id":ObjectId("55a41686b8c3e684af6d4ce1")},{
"$push":{
"comments":{
"id":2}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.findOne()
{
"_id" : ObjectId("55a41686b8c3e684af6d4ce1"),
"title" : "tets",
"content" : "asfasf",
"comments" : [
{
"id" : 1
},
{
"id" : 2
}
]
}
这是一种比较简单的” push”使用形式,也可以将它应用在一些比较复杂的数组操作中。使用” each" 子操作符,可以通过一次"$push” 操作添加多个值。
> db.stock.ticker.update({
"_id" : "GOOG"},
... {
"$push" : {
"hourly" : {
"$each" : [562.776, 562.790, 559.123]}}})
这样就可以将三个新元素添加到数组中。如果指定的数组中只含有一个元素,那这
个操作就等同于没有使用” each"的普通" push” 操作。
db.blog.update({
"_id":ObjectId("55a41686b8c3e684af6d4ce1")},{
"$push":{
"comments":{
"$each":[ {
"id":4},{
"id":6}] }}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.findOne()
{
"_id" : ObjectId("55a41686b8c3e684af6d4ce1"),
"title" : "tets",
"content" : "asfasf",
"comments" : [
{
"id" : 1
},
{
"id" : 2
},
{
"id" : 4
},
{
"id" : 6
}
]
}
如果希望数组的最大长度是固定的,那么可以将” slice"和" push” 组合在一起
使用,这样就可以保证数组不会超出设定好的最大长度,这实际上就得到了一个最
多包含N 个元素的数组:
>
db.movies.find({
"genre" : "horror"},
... {
"$push" : {
"top10" : {
... "$each" : ["Nightmare on Elm Street", "Saw"],
... "$slice" : -10}}})
这个例子会限制数组只包含最后加入的10 个元素。” slice”的值必须是负整数。如果数组的元素数量小于10(” push” 之后),那么所有元素都会保留。如果数组
的元素数量大于10,那么只有最后10 个元素会保留。因此,”$slice” 可以用来在
文档中创建一个队列。
db.blog.update({
"_id":ObjectId("55a41686b8c3e684af6d4ce1")},{
"$push":{
"comments":{
"$each":[ {
"id":9},{
"id":10}],"$slice":-5 }}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.findOne()
{
"_id" : ObjectId("55a41686b8c3e684af6d4ce1"),
"title" : "tets",
"content" : "asfasf",
"comments" : [
{
"id" : 8
},
{
"id" : 9
},
{
"id" : 10
},
{
"id" : 9
},
{
"id" : 10
}
]
}
将数组作为数据集使用
> db.users.update({
"_id":ObjectId("55a419cba1d8ea791f22049f")},{
"$addToSet":{
"emails":"test@jd.com"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : ObjectId("55a413e2b36f8fea7006908b"), "name" : "test", "age" : 33, "sex" : "male", "favorbook" : [ "war", "paech" ] }
{ "_id" : ObjectId("55a4141c8e810e49151c675a"), "name" : "test", "age" : 33, "sex" : "male" }
{ "_id" : ObjectId("55a414238e810e49151c675b"), "name" : "test1", "age" : 33, "sex" : "male" }
{ "_id" : ObjectId("55a419cba1d8ea791f22049f"), "name" : "jing", "emails" : [ "test@jd.com" ] }
> db.users.update({
"_id":ObjectId("55a419cba1d8ea791f22049f")},{
"$addToSet":{
"emails":"test@jd.com"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.users.find()
{ "_id" : ObjectId("55a413e2b36f8fea7006908b"), "name" : "test", "age" : 33, "sex" : "male", "favorbook" : [ "war", "paech" ] }
{ "_id" : ObjectId("55a4141c8e810e49151c675a"), "name" : "test", "age" : 33, "sex" : "male" }
{ "_id" : ObjectId("55a414238e810e49151c675b"), "name" : "test1", "age" : 33, "sex" : "male" }
{ "_id" : ObjectId("55a419cba1d8ea791f22049f"), "name" : "jing", "emails" : [ "test@jd.com" ] }
删除元素
----
有几个从数组中删除元素的方法。若是把数组看成队列或者栈,可以用” pop”,这个修改器可以从数组任何一端删除元素。“$pop”:“key”:1从数组末尾