MongoDB文档嵌套文档筛选

MongoDB文档嵌套文档筛选,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在和MongoDb战斗 我有一个文档集合,单个文档的结构如下 { "_id": { "$oid": "588a931d5c98fe0f3f84d93f" }, "name": "Michele", "type": "F", "category": "G", "meta":{ "code": "113835667", "updated": {"$date": "2017-02-07T00:00:00.000Z"},

我在和MongoDb战斗

我有一个文档集合,单个文档的结构如下

{
    "_id": { "$oid": "588a931d5c98fe0f3f84d93f" },
    "name": "Michele",
    "type": "F",
    "category": "G",
    "meta":{
        "code": "113835667",
        "updated": {"$date": "2017-02-07T00:00:00.000Z"},
        "since": {"$date": "2013-11-07T23:00:00.000Z"}
    },
    "data": [
        {
          "date": {"$date": "2013-11-07T23:00:00.000Z"},
          "close": 12.23
        }
        ... // removed 
        {
          "date": {"$date": "2017-02-07T00:00:00.000Z"},
          "close": 15.22
        }
    ]
}
我需要实现的是返回具有匹配_id的文档,但从数据数组中筛选出日期属性不在指定时间范围内的文档

这就是我从现在开始尝试的

 let id;    //[DocumentId]
 let from;  //[Date]
 let to;    //[Date]
 collection.aggregate([
            { $match: { _id: { $eq: id } } },
            { $unwind: '$data' },
            { $match: { 'data.date': { $gte: from, $lte: to } } },
            { $group: { _id: '$_id', 
                        data: { $push: { date:'$data.date', close: '$data.close' } } } }
        ], ...);
这种方法的问题是,我返回的文档只包含_id和数据属性[data filtering result is ok],而我需要返回完整的可用属性集


非常感谢您的建议

如果您可以升级到Mongo 3.4(最新的稳定版本),那么可以很好地完成:

db.collection.aggregate([
//预筛选以使数据数组至少具有一个匹配日期
{$match:{{u id:id,'data.date':{$gte:from,$lte:to},
//筛选项目数组
{
$addFields:{
“项目”:{
$filter:{
输入:“$data”,作为:“项”,条件:{
美元及:[
{$gte:[“$$item.date”,from]},
{$lte:[“$$item.date”,收件人]}
]
}
}
}
}
}

]);您的MongoDB服务器版本是什么?您正在运行MongoShell的聚合操作吗?@chridam它说mongod版本:3.2.11,没有,我正在使用的是nodejs驱动程序“MongoDB”:“^2.2.6”,可能是