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中执行此操作: