Meteor Mongo查询集合中的数组子集

时间:2016-03-07 14:50:30

标签: javascript arrays mongodb meteor

在查询某些内容时遇到了问题。

我有一个名为Guestlists的集合,其中包含来宾列表。每个元素都包含一个日期和一些其他东西以及一个名为“list”的数组。 “list”数组包含每个guestlist条目的元素。每个访客列表条目都有一个“entryOwner”,表示将条目添加到列表中的人。

这是架构:

Schemas.Guestlist = new SimpleSchema({
  _id: { type: String, regEx: SimpleSchema.RegEx.Id },
  date: { type: Number },
  promoters: { type: [String], regEx: SimpleSchema.RegEx.Id, defaultValue: [] },
  list: { type: Array, defaultValue: [] },
  'list.$': { type: Object },
  'list.$.name': { type: String },
  'list.$.entryOwner': { type: String },
  'list.$.comment': { type: String, optional: true },
  'list.$.accepted': { type: Boolean, defaultValue: false },
  'list.$.rejected': { type: Boolean, defaultValue: false },
})

现在出现了问题。我想查询数据库并获得1个访客列表,只获取特定用户ID的访客列表条目。

这就是我的尝试:

Guestlists.find({_id : guestlistID, list: {$elemMatch: {entryOwner: user._id}}}, {fields: { 'list.$': 1}})

但是,它只返回带有“list”数组中一个项目的guestlist列表,这是第一个。如何获取“list”中包含entryOwner的所有项目?

也尝试过这个,但结果相同:

Guestlists.find({_id: guestlistID}, {fields: {list: {$elemMatch: {entryOwner: user._id}}}})

将它保留为游标也很重要,因为我想在我的出版物中将其保留

2 个答案:

答案 0 :(得分:0)

这是你要找的吗?

 Guestlists.findOne({{_id : guestlistID, list: {$elemMatch: {entryOwner: user._id}}}};

这将GuestLists的返回数量限制为一个。它作为对象返回,而不是长度为1的数组。

答案 1 :(得分:0)

编辑2016-03-08

找到解决整个问题的解决方案!

现在我使用一个包(https://atmospherejs.com/jcbernack/reactive-aggregate)并完全按照他们的描述进行操作。

在发布中,我执行聚合,然后设置一个客户端集合,用于将数据推送到。然后我订阅并从客户端集合中获取数据。

哎呀,我从Meteor论坛得到了一些帮助。

我在寻找的是在MongoDB中使用Aggregate!它确实存在一个很好的包: https://github.com/meteorhacks/meteor-aggregate

这就是我的代码现在的样子:

guestList = Guestlists.aggregate([
    { $match: {nightclubId: nightclubId, date: dateTime}},
    { $unwind: '$list'},
    { $match: {'list.entryOwner': user._id}},
    { $group: {_id: '$_id', list: {$push: '$list'}}}
  ])

现在我的问题是如何将这个从我的出版物返回给客户。