【问题标题】:sails.js Waterline save, read, parse lists or arrayssails.js Waterline 保存、读取、解析列表或数组
【发布时间】:2015-03-29 22:56:40
【问题描述】:

在 Sails Waterline 中创建、读取和解析列表的正确方法是什么?

我在 Stack Overflow 或 Waterline Github 上找不到任何东西。

确切地说,我想在想法模型中保存标签列表,然后能够按标签搜索。

创意模型:

attributes: {
  tags: {
    type: 'string'
  }
}

创建函数(标签以逗号分隔的字符串形式传递)

create: function (req, res, next) {
  tags: req.param('tags').split(',');

  Idea.create(tags, function ideaCreate(err,idea) {
        //do stuff after create
    });
},

这样就成功存储了标签:即`tags = ['tag1', 'tag2', ..., 'tagN']

我尝试过 .find .where 的时髦组合,但无济于事。

简易版:我如何回复一些用户请求的想法tagX

更复杂的版本:如何返回标签列表中至少包含一个标签的任何想法?

【问题讨论】:

    标签: arrays node.js sails.js waterline


    【解决方案1】:

    选项一

    我建议您为您的标签

    创建一个模型
    attributes: {
      ideas: {
        collection: 'idea'
      },
    
      name: {
        type: 'string'
      }
    }
    

    接下来,编辑您的 Idea 模型以引用您的 Tag 模型

    attributes: {
      tags: {
        collection: 'tag'
      },
    
      name: {
        type: 'string'
      }
    }
    

    然后要获得与“tagX”相关的所有想法:

    var tag = "tagX";
    // This same code should also work with an array,
    // but then you will have to use find instead of findOne
    // var tag = ["tagX", "tagY", "tagZ"]
    
    Tag.findOne({name: tag}).populate('ideas').then(function (tag) {
      // Do anything you want with the Ideas.
      tag.ideas.forEach(function(idea) {
        console.log(idea);
      });
    }).catch(console.err);
    

    使用标签“tagX”和“tagY”创建创意“Some Grand Idea” 在集合中添加和删除标签非常容易。

    Promise.all([Idea.create({ name: 'Some Grand Idea'}),
      Tag.create({ name: 'TagX'}),
      Tag.create({ name: 'TagY'})]).
        spread(function (idea, tagX, tagY) {
          // Add tagX
          idea.tags.add(tagX.id);
          // Add tagY
          idea.tags.add(tagY.id);
          // To remove a tag, simply call remove
          // idea.tags.remove(1)
          idea.save(console.log);
        }).catch(console.log);
    

    因此,总而言之,获得一个 Idea 模型。并向 Idea.tags 集合添加/删除标签模型。 这适用于两种方式,即您可以获得一个 Tag 模型并将一个想法添加到 Tag.ideas 集合tag.ideas.add(someIdea.id) 并且它的工作原理相同。

    选项二

    或者,以您设置的方式使用创意模型。

    用一些标签获取想法:

    Idea.find({ tags: { 'like': '%tagX%' }})
    

    通过标签列表获取想法:

    Idea.find({
      or : [
        { tags: { 'like': '%\'tagX\'%' } },
        { tags: { 'like': '%\'tagY\'%' } },
        { tags: { 'like': '%\'tagZ\'%' } }
      ]
    })
    

    【讨论】:

    • 首先,为什么一定要有标签模型?当然,我不必每次想存储列表时都创建模型。对于许多列表来说,这似乎是不可持续的。其次,如何为create()update() 上的想法分配标签。最后,为什么要将想法存储在标签模型中。您存储的信息似乎是完成任务所需的两倍。谢谢,
    • 除非我对问题的解释有误,否则我认为有一个标签模型很有意义。标签是它自己的实体,不是吗?你想搜索标签,听起来你应该有一个模型。如果我错了,您可以执行以下操作:Idea.find({ tags: { 'like': '%tagX%' }}) 我将 reference 存储到标签模型中的想法,并将 reference 存储到想法中的标签模型,以便您可以在标签和想法之间建立多对多的关系。
    • 可能对标签有轻微的误解。我使用标签作为keywords 来描述idea,因此我设想标签是每个想法的属性。我的临时工作是Idea.find({tags: {'contains': tag}})。但是我觉得这可能是解析字符串而不是列表。对于那个项目,它是可以通过的,但我永远不想为生产质量的应用程序这样做。
    • 如果您可以添加如何在模型中正确存储列表,将列表保存到该模型,从该列表中读取并将该列表附加到您的答案中。我很乐意接受您的回答,并请留下您的初始解决方案作为可能的变化。我一定会在新的未来使用它。
    • 我在答案中添加了更多示例。我希望这能回答你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2020-02-04
    • 2012-04-16
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多