1

我正在使用 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 使用相同的查询“查找”用户时,它可以正常工作。但是,执行该函数时,没有找到任何用户。

和想法?谢谢!

4

2 回答 2

2

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

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

您的原始代码不起作用的原因是 Sails ORM(Waterline)不理解本地 Mongo 运算符,例如$in. 但是,由于它使用底层的 Mongo 适配器来执行find操作,因此对单个通道的搜索将匹配在其subscriptions数组中包含该通道的任何记录。请注意,如果您确实需要使用低级别的 Mongo 运算符(如$all),您可以使用native模型类的方法来访问底层的 Mongo 适配器。有关更多详细信息,请参阅此答案

于 2014-02-17T18:39:51.960 回答
0

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

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

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

于 2014-02-14T18:57:19.767 回答