MongoDB从结果中返回一个嵌套文档

时间:2015-02-24 06:01:27

标签: mongodb meteor

我有一个名为"选票"的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查询可以给我结果。

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用sortlimit来完成以下事项:

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}}
);