Javascript 在两个集合之间传递数据-Meteor JS
示例 我有两个集合,一个用于帖子,一个用于标签,如下所示:Javascript 在两个集合之间传递数据-Meteor JS,javascript,mongodb,meteor,meteor-collection2,simple-schema,Javascript,Mongodb,Meteor,Meteor Collection2,Simple Schema,示例 我有两个集合,一个用于帖子,一个用于标签,如下所示: Post { "_id": "WZTEGgknysdfXcQBi", "title": "ASD", "labels": {}, "author": "TMviRL8otm3ZsddSt", "createdAt": "2016-01-14T08:42:42.343Z", "date": "2016-01-14T08:42:42.343Z" } Label { "_id": "9NCNPGH8
Post {
"_id": "WZTEGgknysdfXcQBi",
"title": "ASD",
"labels": {},
"author": "TMviRL8otm3ZsddSt",
"createdAt": "2016-01-14T08:42:42.343Z",
"date": "2016-01-14T08:42:42.343Z"
}
Label {
"_id": "9NCNPGH8F5MWNzjkA",
"color": "#333",
"name": "Grey Label",
"author": "TMviRL8otm3ZsddSt"
}
我想要实现的是拥有多个标签的帖子
问题是我无法将标签数据插入帖子。
我有一个模板来添加新帖子,在那里我在标签上重复。然后在helpers中检查选中的标签并将其存储到数组中,但我无法将该数组插入Posts集合中
'submit .add-entry': function(event) {
var title = event.target.title.value;
var description = event.target.description.value;
var checkedLabels = $('.label-checkbox:checked');
//initiate empty array
var labelsArray = [];
//go over the checked labels
for(i = 0; i < checkedLabels.length; i++){
var label = checkedLabels[i].value;
// store ids into array
labelsArray.push(label)
};
Posts.insert({
title: title,
description: description,
labels: labelsArray
});
“提交.添加条目”:函数(事件){
var title=event.target.title.value;
var description=event.target.description.value;
var checkedLabels=$('.label复选框:checked');
//启动空数组
var labelsArray=[];
//检查检查过的标签
对于(i=0;i
Q1:我应该插入所有标签数据,还是仅ID根据该ID从标签集合中获取更多详细信息
Q2:我如何将标签数组插入到帖子中?上面的代码不起作用,因为它需要一个对象
Q3实现集合之间这种关系的最佳方法是什么?(Q1)您可以将所有标记ID插入到标签列表中并保持更新(Q3)我认为这是一种很好的做法;在您的开发过程中,尝试使用此包中的复合集合发布:
(Q2)插入很容易:
Post.insert({title:'Abc', labels:['one', 'two']});
您需要使用$addToSet
进行更新。下面是一个可能的方法示例:
let setModifier = {
$addToSet: {
labels: myArrayOfLabelIDs
}
};
return Post.update({
_id: id
}, setModifier);
注意:切勿在客户端上使用INSERT(就像您所做的那样)。我的示例可以作为方法添加到服务器上(在其中使用check()
),并可以在提交时从客户端调用,如:
Meteor.call('myMethod', id, labelsArray)
(Q1)您可以将所有标记ID插入到标签列表中并保持更新(Q3)我认为这是一个很好的做法;在您的开发过程中,尝试使用此包的复合集合发布:
(Q2)插入很容易:
Post.insert({title:'Abc', labels:['one', 'two']});
您需要使用$addToSet
进行更新。下面是一个可能的方法示例:
let setModifier = {
$addToSet: {
labels: myArrayOfLabelIDs
}
};
return Post.update({
_id: id
}, setModifier);
注意:切勿在客户端上使用INSERT(就像您所做的那样)。我的示例可以作为方法添加到服务器上(在其中使用check()
),并可以在提交时从客户端调用,如:
Meteor.call('myMethod', id, labelsArray)
问题1:我应该插入所有标签数据还是只插入ID数据
基于该ID的标记集合的详细信息
这取决于:标签是否会更改?如果它是可变的,则最好只存储ID,以便按ID获取标签将始终返回正确的数据。否则,您需要使用新的标签信息更新每篇文章
问题2:如何将标签数组插入到帖子中?上面的代码
不工作,因为它需要一个对象
如果代码不起作用,则可能是您使用了某种不匹配的架构:要插入数组代替对象,您需要修改架构以接受数组。您没有发布架构的详细信息
Q3实现双方关系的最佳方式是什么
收藏
您应该看看“非规范化”:这是在NoSQL数据库(如MongoDB)中用于这类事情的术语。
没有直接的答案,这取决于关系(1-1,1-many,many-1)和每个“many”的比率:在某些情况下,最好将数据嵌套到对象中,如果它们是不可变的,或者处理更新不会太麻烦
这一系列的博客文章应该可以帮助您更好地理解:
问题1:我应该插入所有标签数据还是只插入ID数据
基于该ID的标记集合的详细信息
这取决于:标签是否会更改?如果它是可变的,则最好只存储ID,以便按ID获取标签将始终返回正确的数据。否则,您需要使用新的标签信息更新每篇文章
问题2:如何将标签数组插入到帖子中?上面的代码
不工作,因为它需要一个对象
如果代码不起作用,则可能是您使用了某种不匹配的架构:要插入数组代替对象,您需要修改架构以接受数组。您没有发布架构的详细信息
Q3实现双方关系的最佳方式是什么
收藏
您应该看看“非规范化”:这是在NoSQL数据库(如MongoDB)中用于这类事情的术语。
没有直接的答案,这取决于关系(1-1,1-many,many-1)和每个“many”的比率:在某些情况下,最好将数据嵌套到对象中,如果它们是不可变的,或者处理更新不会太麻烦
这一系列的博客文章应该可以帮助您更好地理解:
谢谢您的回答,但它不起作用。我正在尝试这样插入:Posts.insert({title:title,description:description,labels:labelsArray});我不能这样做,也不能使用addToSet选项…而且,如果我以字符串形式发送单个ID,一切都可以正常工作。你能粘贴得到的错误吗?尝试在meteor shell中执行此操作。:Post.insert({title:'Abc',labels:['one',two']})
谢谢你的回答,但它不起作用。我正在尝试这样插入:Posts.insert({title:title,description:description,labels:labelsArray});我不能这样做,也不能使用addToSet选项…而且,如果我以字符串形式发送单个ID,一切都可以正常工作。你能粘贴得到的错误吗?尝试在meteor shell中执行此操作: