如何从Meteor的MongoDB中的查询中排除ID数组?

时间:2013-10-14 03:29:43

标签: mongodb meteor

我正在尝试做一个相当独特的查询,我似乎无法谷歌自己。这也是我的第一个真正的Meteor应用程序。我正在尝试最终返回用户尚未“喜欢”或“不喜欢”的所有商家信息。

基本上任何拥有foo列表的用户都可以查看所有栏目列表并选择喜欢或不喜欢最终查看是否存在相互匹配。如果他们喜欢这个列表,它会将喜欢列表的_id推送到他们自己的列表中,就像数组一样(同样不喜欢)。在我的前任。在下面,列出ID'a'喜欢列表'b'和& 'd'但还没见过。

匹配部分正在运作,但我不想继续向他们展示他们已经看过的列表。

目前,集合和查询看起来像这样(例如,提取)。目前看起来非常低效和繁琐:

userLikes = listings.findOne({ userId: Meteor.userId() }).likes
userDisikes = listings.findOne({ userId: Meteor.userId() }).dislikes

listings.find({ type: 'bar', 
  likes: {$nin: userLikes }, dislikes: {$nin: userDislikes} })

listings collection:
{
  _id: 'a',
  userId: 'someuserid',
  type: 'foo',
  likes: ['b','d'],
  dislikes: []
},
{
  _id: 'b',
  userId: 'someuserid',
  type: 'bar',
  likes: ['a'],
  dislikes: []
},
{
  _id: 'c',
  userId: 'someuserid',
  type: 'bar',
  likes: [],
  dislikes: []
},
{
  _id: 'd',
  userId: 'someuserid',
  type: 'bar',
  likes: [],
  dislikes: []
}

回想起来(在输入时),我认为我原来的方法是倒置的。我应该将喜欢的列表ID存储在喜欢的列表中吗?例如将用户的_id推送到喜欢列表的wasLikedBy数组或其他内容,以便您可以这样查询: listings.find({type:'bar', {wasLikedBy: {$ne: 'a'}} })

关于如何解决这个问题的任何建议都非常感谢,我也是数据库的新手,所以我试图尽可能地把它全部浸透。

1 个答案:

答案 0 :(得分:1)

设计多对多关系时有三种基本可能性。您可以在一侧存储阵列,也可以在另一侧存储阵列,也可以创建连接表。每种选择都有其优点和缺点,您使用哪种选择取决于您认为简单或更适合模型的内容。无论选择如何,您都应该能够轻松完成所有事情。

在这种情况下,您应该更习惯Mongo如何处理数组。基本上,它将条件应用于数组的所有元素,因此如果对数组参数使用$ne,则会得到不包含数组中给定元素的结果。

长话短说,这是你的代码:

listings.find({
    type: 'bar', 
    likes: {$ne: Meteor.userId()},
    dislikes: {$ne: Meteor.userId()},
});