0

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

基本上任何拥有 foo 列表的用户都可以查看所有酒吧列表并选择喜欢或不喜欢最终查看是否存在相互匹配。如果他们喜欢列表,它会将喜欢列表的 _id 推送到他们自己的列表喜欢数组(与不喜欢相同)。在我的前任。下面,列表 id 'a' 喜欢列表 'b' 和 'd' 但还没有看到 c。

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

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

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: []
}

回想起来(在打字时),我认为我原来的方法是颠倒的。我应该只将likee 的listing id 存储在喜欢的listing 上吗?例如,将用户推_id送到喜欢列表的wasLikedBy数组或其他东西,以便您可以像这样查询: listings.find({type:'bar', {wasLikedBy: {$ne: 'a'}} })

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

4

1 回答 1

1

当您设计多对多关系时,存在三种基本可能性。您可以在一侧、另一侧存储一个数组,或者创建一个连接表。每种选择都有其优点和缺点,您使用哪一种取决于您认为哪个更容易或更适合该模型。无论选择如何,您都应该能够轻松地做所有事情。

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

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

listings.find({
    type: 'bar', 
    likes: {$ne: Meteor.userId()},
    dislikes: {$ne: Meteor.userId()},
});
于 2013-10-14T12:26:54.823 回答