mongodb内嵌数据对象有啥属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb内嵌数据对象有啥属性相关的知识,希望对你有一定的参考价值。

mognodb中, 如果数据结果类似如下:
[html] view plain copy

"_id" : ObjectId("67c898c2561e44e13a580f79"),
"_class" : "com",
"vin" : "123",
"msg" : [

"data" :
"limit" : "1",
"fim" : "e_GLOB1"
,
"name" : "name1"
,

"data" :
"limit" : "2",
"fim" : "e_GLOB2"
,
"name" : "name2"

],
"timestamp" : NumberLong(1470709430)


如果只想返回msg数组中name=name1的元素,即从内嵌数据对象中获取指定元素,可以通过aggregate查询以及$filter操作符实现.
[html] view plain copy
db.collectionname.aggregate($match: "msg.name": "name1", $project: _id: 0, timestamp: "$timestamp", msg: $filter: input: "$msg", as: "msg", cond: $eq: ["$$msg.name", "name1"])

_id:0表示不返回_id字段,因为_id默认是返回的, 这里也取了timestamp字段.
返回结果如下:
[html] view plain copy
"msg" : [

"data" :
"limit" : "1",
"fim" : "e_GLOB1"
,
"name" : "name1"

],
"timestamp" : NumberLong(1470709430)


注意$filter操作符是在3.2.*版本才加上的,所以以前的版本是没有这个操作符的.
nodejs代码:

[html] view plain copy
function(d, callback)
var db = mongojs(mongoUri);
var condition =
"timestamp": $gte: parseInt(d.t1), $lte: parseInt(d.t2),
"msg.name" : d.msg_name
;
db.collection(data_table_name).aggregate($match: condition, $project: _id: 0, timestamp: "$timestamp", msg: $filter: input: "$msg", as: "msg", cond: $eq: ["$$msg.name", d.msg_name], function(err, data)
if(err)
callback(err);
else
callback(null, data);

db.close();
);
;
参考技术A
"_id" : ObjectId("67c898c2561e44e13a580f79"),
"_class" : "com",
"vin" : "123",
"msg" : [

"data" :
"limit" : "1",
"fim" : "e_GLOB1"
,
"name" : "name1"
,

"data" :
"limit" : "2",
"fim" : "e_GLOB2"
,
"name" : "name2"

],
"timestamp" : NumberLong(1470709430)

mongoDB

1.MongoDB介绍(数据库是用来存数据的)
- 特点
- mongodb是nosql(not only sql)数据库中的一种
- 以bson(binary json)文档方式存储数据
- 优点
- 高开发效率:
- 采用bson文档,避免了表(table)和对象(object)的映射
- 使用对象语法,js语法上手容易
- 高性能(查询性能):
- 内存映射:比磁盘io操作快
- 内嵌属性:避免了多表联查
- 高扩展
- 天生分布式数据库,易扩容
- 非结构,可动态的扩展各种属性
- 缺点
- 不支持事务操作
- 占用空间过大
2.安装MongoDB
- 安装过程:next -> 勾上checkbox 再点next -> custom -> browser选择存储mongdodb的磁盘路径 -> next -> install
- 配置环境变量
- 右键我的电脑 -> 属性 -> 左侧高级系统设置 -> 高级菜单最下面的环境变量 -> 找到系统变量中的path
-> 把D:\sdk\MongoDB\Server\3.2\bin路径追加到变量值中(mongodb中的bin目录),确保与之前的路径之间有个分号;
例如:
D:\sdk\nodejs;D:\sdk\MongoDB\Server\3.2\bin
其中,nodejs后面有个分号把mongodb的路径隔离开
- 创建数据存放文件夹D:\sdk\MongoDB\db
- 修改mongoStart.bat文件的路径
- 启动数据库
3.数据库组成
- 数据库
- 集合:可以理解为数组
- 文档(bson):可以理解为对象
- key-val:可以理解为对象的属性
4.数据类型
5.mongo shell
5.数据库操作
- 连接到数据库:
var conn = new Mongo("host:port");
- 获取数据库对象(Database对象)
var db = conn.getDB("test");
- 安装好mongodb后,就会自动创建两个库:admin和test
- 删除数据库
db.dropDatabase();
- 还可以使用另外一种方式:
use test;
show dbs;
6.集合操作
- 创建集合
db.createCollection("name");
- 获取集合
db.getCollection("name");
- 删除集合
collections.drop();
7.文档操作
- 增
- collections.insert({name: "zhangsan", age: 18});
- 删
- collection.remove({}) 删除所有,{}是query对象
- collection.remove(query, false)
- true 只删第一个
- false 删除匹配的所有,默认
- 改
- collections.update(query, update, upsert, multi);
- query 查询对象
- update 更改
- upsert
- true 没有匹配的就新增
- false 没有匹配什么都不做
- multi
- true 更新所有匹配文档
- false 值更新第一个文档
eg:
collections.update(
{
name: "zhangsan",
},
{
$inc: {age: 1},
$set: {name: "zhangsandege", sex: "female"},
$push: {phoneNum: "186xxx"},
$sort: {age: 1}
}, false, true);
- 查
- 查询
collections.find({name: "zhangsan"});//{name: "zhangsan"}这个json对象就是query对象
- 游标(数组的引用)
var cursor = studentsColl.find();//查找所有的
- 显示数据
var cursor = studentsColl.find();
cursor.forEach(function(obj) {
printjson(obj);
});
- 限制字段
studentsColl.find(query, {name: 1, age: 0})
- 1 表示显示该属性
- 0 表示去掉该属性
- 统计
cursor.count();
- 排序
cursor.sort({name: 1, age: -1});
- 1 升序
- -1 降序
- 正则
{name: {$regex: /^zhang.{0,}$/}}
- 分页
cursor.limit(num);
- num为限制数量,前三个
cursor.skip(num);
- num为跨过数量
cursor.skip(0).limit(10);
cursor.skip(10).limit(10);
- 去重
collection.distinct("name", {age: 18});
- 第一个参数是指定去重复的那个属性
- 第二个参数是query对象
- 分组
var results = collections.group(
{
key: {name: 1, age: 0},
cond: {},
initial: {count: 0, vowels: 0, consonants: 0},
$reduce: function(obj, prev) {
prev.count++;
prev.vowels += obj.stats.vowels;
prev.consonants += obj.stats.consonants;
},
finalize: function(obj) {
obj.total = obj.vowels + obj.consonants;
}
}
);
- 聚合
collections.aggregate({
{$match: {sex: "male"}},
{$group: {_id: "$className", largest: {$max: "$age"}, smallest: {$min: "$size"}}},
{$sort: {_id: 1}}
});
8.权限

以上是关于mongodb内嵌数据对象有啥属性的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 如何查询和修改内嵌文档

mongoDB在java中怎么根据内嵌文档条件查询

MongoDB:文档、记录和属性之间有啥区别?

高可用的MongoDB集群

MongoDB 的功能

mongodb有啥可视化工具