试图在流星中合并两个集合

时间:2017-11-03 23:12:15

标签: javascript mongodb parsing meteor collections

我的应用程序中有两个集合,它们是从两个独立的json文件中解析出来的。我已将这两个文件中的数据插入到单独的集合中。集合具有相应的数字ID,我想在新的集合中匹配它们。例如: postmeta 集合的值为post_id 帖子 集合具有相应的{ {1}}。

这里进一步解释这是一个简单的集合示例。有一点需要注意的是,有超过730个收集帖子,虽然有匹配的ID,但它们没有排序,因此当我查看它们时它们彼此不匹配。

帖子 集合示例:

ID

postsmeta 集合示例:

{
  "_id": "kTeQxenYZcQfPiaYv",
  "ID": "44",
  "post_content": "Today we talked about the letter Hh..."
} 

我想要做的是解析收藏品,并采用 帖子 集合,其中{ "_id": "otEGQYxvv6MkCABST", "post_id": "44", "meta_value": "http://www.mrskitson.ca/wp-content/uploads/2010/11/snackTime.jpg" } postsmeta相匹配 集合。找到匹配后,我想将集合内容(ID& post_content)插入新集合中。

到目前为止,这是我的所有代码。

LIB /集合/ posts.js

meta_value

服务器/ publications.js

Postsmeta = new Mongo.Collection('postsmeta');
Posts = new Mongo.Collection('posts');

服务器/ main.js

Meteor.publish('postsmeta', function() {
  return Postsmeta.find();
});

Meteor.publish('posts', function() {
  return Posts.find();
});

2 个答案:

答案 0 :(得分:3)

让我们稍微重构你的代码。我们将首先构建Postsmeta集合,然后共同创建PostsPostsCombined集合。由于Postsmeta已经存在,我们可以在其中搜索以查找匹配的文档。

Meteor.startup(() => {
  const postsmeta = JSON.parse(Assets.getText('postsmeta.json'));
  postsmeta.forEach(doc => {
    Postsmeta.insert({ post_id: doc.post_id, meta_value: doc.meta_value }); 
  });

  const posts = JSON.parse(Assets.getText('posts.json'));
  posts.forEach(doc => {
   const post = { ID: doc.ID, post_content: doc.post_content}
    Posts.insert(post); // omit if you don't need the uncombined collection
    const metadoc = Postsmeta.findOne({post_id: doc.ID}); // essentially a JOIN
    if (metadoc) post.meta_value = metadoc.meta_value; // guard against no matching meta
    PostsCombined.insert(post);
  });   
});

postsmeta data中没有以下ID:

   ["56", "322", "521", "563", "583", "608", "625", "671", "707", "708",
    "711", "713", "754", "758", "930", "1068", "1126", "1235", "1237", "1238",
    "1239", "1246", "1249", "1256", "1263", "1355", "1375", "1678", "1680", "1763",
    "1956", "2107", "2121", "2148", "2197", "2249"]

答案 1 :(得分:0)

您想将这些藏品放在一起进行咨询吗?因为插入对于两个不同的集合是正确的。

提示

如果是查询使用" find().map()",如果你使用mongodb,在函数中它会返回第一个集合的每一行的值,很快你就会可以调用其他集合并检查集合的ID并返回所需内容的JSON或数组。我并不假装这样做,但这是将两个系列放在一起的一种方式。

最佳解决方案

正确的方法是不要认为noSql是一个关系数据库,就像其他postgres,mysql等...认为它是一个动态银行,在同一个集合中,你可以拥有当时所需的一切,所以我认为你创建了一个新的集合,它将是两者的结合,当save将数据保存在这个其他集合中时,这将是查询集合,并且它会减轻查询的重量,直到它返回数据更快,但假设比上面的例子快5倍...

我希望我有所帮助,对此我会有任何疑问或怀疑。拥抱!