我有一个名为"选票"的MongoDB系列。它看起来像这样:
{
"_id" : "msw9ofwQSj58qiPvY",
"ballotName" : "This is the ballot name",
"votes" : [
{ "unitNumber" : "30", "voteResult" : "No", "voteDate" : ISODate("2015-02-24T05:03:22.937Z") },
{ "unitNumber" : "30", "voteResult" : "Yes", "voteDate" : ISODate("2015-02-24T05:20:02.479Z") }
]
}
我想只看到LATEST" votes.voteResult"对于这个_id和unitNumber:30。我试试:
db.ballots.find(
{ $and: [
{_id: 'msw9ofwQSj58qiPvY'},
{'votes.unitNumber': '30'}
] },
{'votes.voteResult': 1, 'votes.voteDate': 1, _id: 0} )
结果:
{
"votes" : [
{
"voteResult": "No",
"voteDate" : ISODate("2015-02-24T05:03:22.937Z")
},
{
"voteResult": "Yes",
"voteDate" : ISODate("2015-02-24T05:20:02.479Z")
}
]
}
看起来不错,但我只想要一个" voteResult"回来。我只想要最新的一个。我似乎无法弄清楚如何获得嵌套结果集之一,并确保它是最新的结果集。如果它有任何帮助,我使用的Meteor / javascript可能可以处理这个的编码逻辑,但希望一个简单的MongoDB查询可以给我结果。
非常感谢任何帮助。感谢。
答案 0 :(得分:0)
您可以使用sort
和limit
来完成以下事项:
db.ballots.find(
{ $and: [
{_id: 'msw9ofwQSj58qiPvY'},
{'votes.unitNumber': '30'},
] },
{'votes.voteResult': 1, 'votes.voteDate': 1, _id: 0}
).sort({'votes.voteDate':-1).limit(1);
你们两个都回来了,但是如果你通过voteDate对它们进行排序并返回第一个,那么你应该得到你想要的那个。
您也可以使用aggregate
代替find
在服务器端执行此操作:
db.ballots.aggregate(
{$match :
{$and: [
{_id: 'msw9ofwQSj58qiPvY'},
{'votes.unitNumber': '30'},
]}
},
{$unwind: "$votes"},
{$sort: {'votes.voteDate': -1}},
{$limit: 1},
{$project: {'votes.voteResult': 1, 'votes.voteDate': 1, _id: 0}}
);