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

Posted

技术标签:

【中文标题】Sails.js - 如何对具有数组类型属性的模型进行本机查询?【英文标题】:Sails.js - How to do a native query on a model that have an attribute of array type? 【发布时间】:2016-08-04 19:41:38 【问题描述】:

我使用sails.js 构建了一个网络应用程序,我的数据库是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” - 我猜是“加入”。

当我使用“查找”从“对话”集合中获取文档时,我得到以下信息:

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

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

我的问题:

当我尝试使用此代码对“成员”使用本机查询时,我没有得到任何结果:

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);
  );
);

我认为问题在于对话文档中没有“成员”字段,因此没有结果是有道理的。

所以,如果我想对“成员”进行本机查询(因为sails 查询还不够)- 我该怎么做? 或者如何在对话文档中添加“成员”字段?

非常感谢!

【问题讨论】:

【参考方案1】:

将您的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 提供的老式填充方法。

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
);

【讨论】:

谢谢!但是,如果我想在所有成员都是“X”和“Y”的情况下找到一个对话 - 我该怎么做? 您可以通过添加填充Conversation.findOne(criteria).populate('members', id: idArrayOfUsers).exec(function(err, results) // do something with your result. );的条件来做到这一点 再次感谢,但根据我的检查,如果她的 id 在 idArrayOfUsers 中,此行将填充用户。我想通过成员 ID 查找对话...

以上是关于Sails.js - 如何对具有数组类型属性的模型进行本机查询?的主要内容,如果未能解决你的问题,请参考以下文章

从 Sails.js 中的关联模型访问模型的属性

如何自动解析 Sails.js 路由上的模型属性?

Sails.js 对关联值的查询

Sails js:如何在 Sails js 的单个模型中定义两个 MySQL 连接到两个不同的数据库?

如何在 Sails.js 中定义需要来自第三个模型/表的附加条件和/或数据的模型关联?

Sails Js - 防止非模型字段保存在 mongo 文档中