mongodbは、埋め込みデータオブジェクトから指定要素を取得します.


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=name 1の要素だけを返したい場合、すなわち埋め込みデータオブジェクトから指定要素を取得し、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();
    });
};