我正在尝试查找特定记录(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
只有一个对象。
答案 0 :(得分:1)
$ elemMatch投影仅返回满足条件的第一个匹配元素。查看documentation。
使用聚合将是实现您想要的正确方法。请参阅以下内容:
db.bar.aggregate([
{$match:{_id:1}},
{$unwind:"$history"},
{$match:{"history.timestamp":{$gt:0}}},
{$group:{_id:"$_id", history:{$push:"$history"}}}
])