mongodb从内嵌数据对象中获取指定元素

本文介绍如何在MongoDB中从内嵌的数据对象中提取特定元素。通过一个实例展示了在Node.js环境中操作MongoDB数据库,选择性地获取包括timestamp在内的字段,而不返回_id字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mognodb中, 如果数据结果类似如下:

{
	"_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操作符实现.

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字段.

返回结果如下:

{	"msg" : [
		{
			"data" : {
				"limit" : "1",
				"fim" : "e_GLOB1"
			},
			"name" : "name1"
		}
	],
	"timestamp" : NumberLong(1470709430)
}

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

nodejs代码:

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();
    });
};



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值