Javascript execMatch只返回第一个结果
我试图找到一个特定的记录(id为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
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字段知道??哦,看起来我读的是forelemMatch
,而不是投影文档。非常令人困惑。你是对的,它令人困惑。如果我能找到一种方法来完成你想做的事情,我会在这里发布。谢谢!我也会这么做。我已经发布了一个替代方法。试试看。