execMatch只返回第一个结果

时间:2014-03-12 19:40:24

标签: javascript node.js mongodb mongoose database

我正在尝试查找特定记录(ID为1),然后仅返回其history字段。此history字段是具有timestamp属性的对象数组。当我返回此历史记录字段时,我希望它仅包含timestamp属性大于0的对象。

样本集

[{
    "_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 } } } });

问题:我知道只会有一个结果(因为我选择了标识1),但我使用$elemMatch来填充其history包含时间戳大于0所有对象的字段。问题是history只有一个对象。

1 个答案:

答案 0 :(得分:1)

$ elemMatch投影仅返回满足条件的第一个匹配元素。查看documentation

使用聚合将是实现您想要的正确方法。请参阅以下内容:

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