Sails.js - 如何在具有数组类型属性的模型上执行本机查询?

时间:2016-08-04 19:41:39

标签: mongodb sails.js sails-mongo

我使用sails.js构建了一个Web应用程序,我的数据库是mongo。

这是我的模特 - 对话:

module.exports = {

  tableName: 'conversations',

  attributes: {

    members: {
      type: 'array',
      collection: 'user'
    },

    status: {
      type: 'boolean',
      defaultsTo: true,
      required: true
    }
  }

};

正如您在上面所看到的,我有一个成员数组(用户模型)。 但是,在数据库中,Conversations集合的每个文档都保存而不是"成员"字段,但Sails js创建了一个新的集合" conversation_members__user_members_user" - 对于"加入"我想。

当我使用"发现"从" Conversations"中获取文档我得到了这个:

{  
   "status": true,
   "createdAt": "2016-08-03T18:55:03.993Z",
   "updatedAt": "2016-08-03T18:55:04.016Z",
   "id": "57a23e079983469c1a20810a"
}

当然,没有"成员" (因为帆将它们保存在另一个集合中)。

我的问题:

当我尝试在"成员"上使用本机查询时使用此代码我没有结果:

var members = ["579d083a38db0c7c07860819", "579d088fbab7ec0c0be80c77"];

Conversation.native(function(err, collection) {

   collection.find({ members.id: {'$all':members }}).toArray(function(err, results) {

    if (err) return res.serverError(err);
    return res.ok(results);
  });
});

我认为问题在于没有"成员"对话文档中的字段,因此没有结果是有意义的。

所以,如果我想对"成员"进行原生查询。 (因为帆的查询还不够) - 我该怎么做? 或者如何添加"成员"对话文档的字段?

非常感谢!

1 个答案:

答案 0 :(得分:0)

将您的User model更改为包含conversations属性:

conversations: {
      collection: 'Conversation',
      via: 'members',
      dominant: true
    }

然后将Conversation模型更改为

members: {
      collection: 'User',
      via: 'conversations'
    }

然后,您可以将新用户添加到对话

var criteria = {id: '12345'};
User.findOne(criteria).exec(function(err, user) {
  if(err) // handle error

  user.conversations.add({id: 'the id of conversation to which you need to add the user'});

  user.save(function(err) {});
});

要检索对话的成员,您可以使用waterline提供的旧的populate方法。

Conversation.findOne(criteria).populate('members').exec(function(err, results){
// do something with your result.
});

您可以检索用户所使用的会话:

User.findOne(criteria).populate('conversations').exec(function(err, results){
// your desired result
});