一、数组相关
1、 更新数组中的某个值
users 表中有一条记录:
{
name:'Tom'
friends : [
{ name: '张三', age: 1 },
{ name: '李四', age: 2 }
]
}
现在我们要改李四的年龄为 3岁:
> db.users.update({
name:'Tom',
'friends.name':'李四'
},{
$set:{
'friends.$.age' : 3
}
});
注意
$
定位符,该方法只会修改第一条匹配到的数据
2、删除数组中的一条记录
文档格式如下:
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502"),
"links": [
{
"name": "Google",
"url": "http://www.google.com"
},
{
"name": "Baidu",
"url": "http://www.baidu.com"
},
{
"name": "SoSo",
"url": "http://www.SoSo.com"
}
]
}
1)、根据属性删:要删除 links 中 name 是 Baidu 的记录
db.collection.update(
{ _id: ObjectId('id') },
{ $pull: { links: { name: 'Baidu' } } }
);
2)、根据索引删除,索引从 0 开始
db.collection.update(
{ _id: ObjectId('id') },
{ $unset: { 'links.1': 1 } }
);
这种方式会导致:原来的值会替换为 null
3、排序
1)、元素为对象类型
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502"),
"links": [
{
"name": "Google",
"age": 12
},
{
"name": "Baidu",
"age": 19
},
{
"name": "SoSo",
"age": 9
}
]
}
语法:按照links
中每个对象的age
字段 进行倒序
排列
db.collection.update(
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502")
},
{
$push: {
links: {
$each: [], // 如果只为排序,这个需要给一个空数组
$sort: { age: -1 } # $sort 必须与 $push 和 $each配合使用
}
}
}
)
2)、基础类型
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502"),
"links": [5, 8, 1, 23, 9]
}
语法:对links
字段倒序排列
db.collection.update(
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502")
},
{
$push: {
links: {
$each: [], // 如果只为排序,这个需要给一个空数组
$sort: -1 # $sort 必须与 $push 和 $each配合使用
}
}
}
)
4、新增元素
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502"),
"links": [5, 8, 1, 23, 9]
}
语法:避免重复 $addToSet
db.collection.update(
{
"_id" : ObjectId("56e2a92ccc6dd2271953e502")
},
{
$addToSet: {
links: {
$each: [8, 12, 15] # 8 重复了,不会被添加。
}
}
}
)
三、经纬度筛选
1、弧度查询,则以 ** 公里数 ** 除以6371,如“附近500米的餐厅”:
> db.runCommand( { geoNear: "places", near: [ 121.4905, 31.2646 ], spherical: true,
$maxDistance: 0.5/6371 })
4、根据数组中是否含有某个元素来查询匹配的记录
$all
> db.fruitshop.find();
{ "_id" : ObjectId("5022518d09248743250688e0"), "name" : "big fruit", "fruits" : [ "apple", "pear", "orange" ] }
{ "_id" : ObjectId("502251a309248743250688e1"), "name" : "good fruit", "fruits" : [ "banana", "pear", "orange" ] }
{ "_id" : ObjectId("502251c109248743250688e2"), "name" : "good fruit", "fruits" : [ "banana", "apple", "tomato" ] }
> db.fruitshop.find({"fruits":{"$all":["apple","banana"]}});
{ "_id" : ObjectId("502251c109248743250688e2"), "name" : "good fruit", "fruits" : [ "banana", "apple", "tomato" ] }
>
5、导出为CSV
mongoexport -d myDB -c user -f _id,name,password,adress --csv -o ./user.csv
-d 标示 数据库
-c 标示 数据表
-f 需要提取的field用逗号分隔
-o 输出路径
6、分组查询
aggregate-分组查询
group这个对象。
后面的字段是用来分组的字段,如果不取值,可以写成: _id:null
amount',用于计算该字段的加和。
如果想统计个数,可以这么写:total:{$sum : 1};