Javascript execMatch只返回第一个结果

Javascript execMatch只返回第一个结果,javascript,node.js,mongodb,mongoose,database,Javascript,Node.js,Mongodb,Mongoose,Database,我试图找到一个特定的记录(id为1),然后只返回它的历史字段。此历史记录字段是具有时间戳属性的对象数组。当我返回此历史记录字段时,我希望它只包含属性大于0的timestamp对象 样本采集 [{ "_id" : 1, "history" : [ { "content" : "hello", "timestamp" : 1394639953878, "_id" : ObjectId("53208

我试图找到一个特定的记录(id为
1
),然后只返回它的
历史
字段。此
历史记录
字段是具有
时间戳
属性的对象数组。当我返回此历史记录字段时,我希望它只包含属性大于
0
timestamp
对象

样本采集

[{
    "_id" : 1,
    "history" : [
        {
            "content" : "hello",
            "timestamp" : 1394639953878,
            "_id" : ObjectId("53208451767743b748ddbd7d")
        },
        {
            "content" : "world",
            "timestamp" : 1394639953879,
            "_id" : ObjectId("33208451767743b748ddbd7e")
        }
    ]
}]
因此,根据Mongo和Mongoose文档,我做了如下工作:

model.find({_id: 1})
     .select({ history: { $elemMatch: { timestamp: { $gt: 0 } } } });

问题:我知道只有一个结果(因为我选择了id
1
),但我使用
$elemMatch
时间戳大于
0
的所有对象填充其
历史
字段。问题是,$elemMatch投影只返回满足条件的第一个匹配元素,
历史记录中只有一个对象。结帐

我认为,使用聚合将是实现您想要的目标的正确方法。请参阅下文:

db.bar.aggregate([
{$match:{_id:1}}, 
{$unwind:"$history"}, 
{$match:{"history.timestamp":{$gt:0}}}, 
{$group:{_id:"$_id", history:{$push:"$history"}}}
])

“时间戳”是什么?
timestamp
只是
history
字段中包含的对象上的任意数字属性。您可以发布一个示例文档吗?添加了一个示例集合。您特别选择的文档由\u id字段知道??哦,看起来我读的是for
elemMatch
,而不是投影文档。非常令人困惑。你是对的,它令人困惑。如果我能找到一种方法来完成你想做的事情,我会在这里发布。谢谢!我也会这么做。我已经发布了一个替代方法。试试看。