Arrays sails.js Waterline保存、读取、解析列表或数组
在帆船水线中创建、读取和分析列表的正确方法是什么? 我在堆栈溢出或水线Github上找不到任何东西 确切地说,我想在idea模型中保存一个标签列表,然后能够按标签进行搜索 创意模式:Arrays sails.js Waterline保存、读取、解析列表或数组,arrays,node.js,sails.js,waterline,Arrays,Node.js,Sails.js,Waterline,在帆船水线中创建、读取和分析列表的正确方法是什么? 我在堆栈溢出或水线Github上找不到任何东西 确切地说,我想在idea模型中保存一个标签列表,然后能够按标签进行搜索 创意模式: attributes: { tags: { type: 'string' } } 创建函数(标记以逗号分隔的字符串形式传递) 这成功地存储了标记:即'tags=['tag1','tag2',…,'tagN'] 我尝试了.find.where的时髦组合,但没有效果 简易版:如何返回一些用户请求的想法
attributes: {
tags: {
type: 'string'
}
}
创建函数(标记以逗号分隔的字符串形式传递)
这成功地存储了标记:即'tags=['tag1','tag2',…,'tagN']
我尝试了.find
.where
的时髦组合,但没有效果
简易版:如何返回一些用户请求的想法tagX
更难的版本:如何从标签列表中返回至少有一个标签的想法?选项一
我建议您为标签创建一个模型
接下来,编辑您的创意模型以参考您的标签模型
然后,要获得与“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”的创意“一些伟大的创意”
在集合中添加和删除标记非常简单
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.tags集合中添加/删除标记模型。
这是双向的,也就是说,您可以获得一个标签模型,并将一个想法添加到Tag.ideas集合Tag.ideas.add(someIdea.id)
,其效果相同
选择二
或者,以您设置的方式使用Idea模型
使用一些标签获取想法:
Idea.find({ tags: { 'like': '%tagX%' }})
使用标签列表获取想法:
Idea.find({
or : [
{ tags: { 'like': '%\'tagX\'%' } },
{ tags: { 'like': '%\'tagY\'%' } },
{ tags: { 'like': '%\'tagZ\'%' } }
]
})
首先,为什么必须有一个标签模型?当然,我不必每次存储列表时都创建模型。这在许多清单中似乎是不可持续的。其次,如何在
create()
update()
上为想法分配标签。最后,为什么要在标记模型中存储想法。看起来您存储的信息是完成任务所需信息的两倍。谢谢,除非我把这个问题解释错了,否则我认为有一个标签模型是很有意义的。标签是它自己的实体,不是吗?你想搜索标签,听起来你应该有一个模型。如果我错了,你可以这样做:Idea.find({tags:{'like':'%tagX%})
I在标记模型中存储对想法的引用,在Idea模型中存储对标记的引用,这样你就可以在标记和想法之间建立多对多的关系。可能对标记有一点误解。我将标记用作描述一个想法的关键字
,因此我设想标记是每个想法的一个属性。我的临时工作是Idea.find({tags:{'contains':tag}})
。但是我觉得这可能是在解析字符串,而不是列表。对于那个项目,它是可以通过的,但我永远不想这样做的生产质量应用。如果你可以添加如何正确地存储一个列表在模型,保存一个列表到该模型,从该列表中读取,并附加到该列表到您的答案。我很乐意接受您的回答,请留下您的初始解决方案作为可能的变体。我肯定会在新的未来使用它。我在答案中添加了更多的例子。我希望这能回答你的问题。
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.find({ tags: { 'like': '%tagX%' }})
Idea.find({
or : [
{ tags: { 'like': '%\'tagX\'%' } },
{ tags: { 'like': '%\'tagY\'%' } },
{ tags: { 'like': '%\'tagZ\'%' } }
]
})