mongodb用法小结 - liviamarre/myRoad GitHub Wiki

查找数组元素中是否有某一个field的值

数组操作

{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
    "1" : "reading",
    "2" : "swimming",
    "3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
    {
        "fname" : "deng",
        "lname" : "pan"
    },
    {
        "fname" : "qiang",
        "lname" : "he"
    },
    {
        "fname" : "dongren",
        "lname" : "zeng"
    }
]}

push方法

push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。下面我们把新朋友加进去。用push方法的时候,如果加入的元素和数组中元素相同,它也会加入到数组中。

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$push:{“relationships”:{“fname”:”xiong”,”lname”:”lan”}}})

pop方法

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pop:{“relationships”:1}})
删除数组最后一个对象
db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pop:{“relationships”:-1}})
删除数组第一个对象

pull方法

它会把符合条件的数组元素都删除

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$pull:{“relationships”:{“fname”:”dongren”,”lname”:”zeng”}}})

ne方法

$ne主要拿来判断,若数组里面有这个值,则不插入;没有才插入。

db.user.update({“relationships.fname”:{ne:"xiong"}},{set:{“fname”:”xiong”,”lname”:”lan”}})

addToSet方法

addToSet比addToSet比ne更好用,它可以自己判断数据是否存在,而且它和each结合使用,还能同时在数组中插入多个数据,这是each结合使用,还能同时在数组中插入多个数据,这是ne没办法办到的,下面我们来看一下addToSet的用法,这里顺便结合了addToSet的用法,这里顺便结合了each的使用:

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{addToSet:{"relationships":{each:[{“fname”:”xiong”,”lname”:”lan”},{“fname”:”dongren”,”lname”:”zeng”}]}}})

位置和操作符“$”

有时候数组有多个值,而我们只想对其中的一部分进行操作。如果我们把整个文档都抄下来,那太麻烦也太愚蠢了。好在mongodb给我们提供了两种简便方法:通过位置或者操作符“$”。下面我们来分别看看这两种方法怎么使用。首先是通过数组位置来操作。数组都是以0开头的,可以将下标直接作为键来选择元素。例如,我们想给数组的第一个数据加上年龄键值对,我们可以这么操作:

db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$set:{“relationships.0.age”:22}})

可是很多情况下,不预先查询文档我们就不知道要修改数组的元素的下标。这时定位操作符“$”就很好用了。它就是用来定位查询文档已匹配的元素,并进行更新。我们来看看它怎么用:

db.user.update({“relationships.fname”:”xiong”},{set:{"relationships.$.age”:22}})