【问题标题】:MongoDB find $in not working in sails.jsMongoDB 发现 $in 在sails.js 中不起作用
【发布时间】:2014-02-14 18:38:53
【问题描述】:

我正在使用 Sail.js 及其 Waterline ORM 创建一个简单的应用程序。作为其中的一部分,我遵循 NoSQL 的数据透视表模式:每个用户都有一个数组,subscriptions,包含他们订阅的所有频道。我正在尝试使用以下命令查找订阅了特定频道 ID 的所有用户:

User.find({subscriptions: {$in: [req.param('channel')]}}).done(function (err, users) {
   /* ... */
});

不是每个编写的最漂亮的代码行,但它应该工作。问题是,它没有。 users 是一个空数组,err 是空的。他们查询实际执行的是,例如(使用节点检查器):

{ subscriptions: { '$in': [ '52fd1a033004de2d9bcb4980' ] } }

当通过 umongo GUI 使用相同的查询“查找”用户时,它可以正常工作。但是执行该函数时没有找到用户。

还有什么想法?谢谢!

【问题讨论】:

    标签: javascript node.js mongodb sails.js waterline


    【解决方案1】:

    仅供参考,接受的答案是有效的 Mongo 查询,但不是有效的 Sails 代码。你想要:

    User.find({subscriptions: req.param('channel')}).done(function (err, users) {
      /* ... */
    });
    

    您的原始代码不起作用的原因是 Sails ORM(Waterline)不理解像 $in 这样的原生 Mongo 运算符。但是,由于它使用底层 Mongo 适配器来执行 find 操作,因此搜索单个通道将匹配在其 subscriptions 数组中包含该通道的任何记录。请注意,如果您确实需要使用低级别的 Mongo 运算符(如 $all),您可以使用模型类的 native 方法来访问底层的 Mongo 适配器。详情请见this answer

    【讨论】:

      【解决方案2】:

      您不需要 $in 来查找数组中的内容。一个简单的查找就可以解决问题:

      db.users.find({subscriptions : '52fd1a033004de2d9bcb4980'})
      

      将返回所有使用该频道的用户。

      【讨论】:

      • 啊,谢谢!不过,对 Mongo 来说有点新,如果有人知道的话,我会很好奇为什么我的初始代码不起作用。
      • $in 要求记录在您提供的数组中。它不需要您提供的值在记录数组中。
      • 例如,您希望所有名字为 john、peter 或 paul 的用户: db.users.find({firstName : {$in : ['john', 'peter', 'paul ']}})。这与您使用它的方式有点相反。
      • 这是有效的 mongo,但没有回答关于如何在 Sails 中进行查询的原始问题...
      • @joao 没问题的人 :) Sails/Waterline 可以像这样非常简单的跨数据库进行基本查询。一般来说,您需要依赖本机查询越少越好,因为它使您的应用程序代码更具可移植性(即,如果您希望将来为您的一个或所有模型切换到 PostgreSQL、MySQL 或 Redis,它一切仍然有效)
      猜你喜欢
      • 2022-08-20
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      相关资源
      最近更新 更多