【问题标题】:How can I exclude an array of IDs from a query in Meteor's MongoDB?如何从 Meteor 的 MongoDB 中的查询中排除一组 ID?
【发布时间】:2013-10-14 03:29:43
【问题描述】:

我正在尝试做一个相当独特的查询,我似乎无法通过谷歌搜索自己。这也是我的第一个真正的 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'}} })

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

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 太棒了!谢谢,非常感谢!
    猜你喜欢
    • 2011-06-02
    • 2013-02-18
    • 2017-12-23
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多