Meteor从函数中操纵Mongodb数据

时间:2016-04-19 13:45:59

标签: mongodb meteor

我在我的名为Plants的集合中加载了一个数据集。这是一个植物的例子:

{
"_id": "zGdXzfFTAzhrhCvqE",
"Plant": "Carrot",
"Companions": ["Beetroot", "Dandelion", "Rose"]
}

我需要更新我的收藏,以便每个伴侣都是一个记录(有一个_id),所以首先我要检查伴侣是否已经有一个_id,但我似乎无法正确使用语法。

  //why does'nt this work?
  var com = Plants.find({"Plant": "Thyme"});
  console.log("id: " + com._id); //returns undefined, even though it exists   in the collection

  //this works 
  Plants.find({}).forEach(function(plant){
    var companions = plant.Companions;
    console.log(companions[0]);  //prints out the first plantname in the array

    //here I need to check if the plant is already in the collection
    for(var i = 0; i < companions.length; i++){
      var com_plante = Plants.findOne(companions[i]);
      //this writes out undefined
      console.log("com_plante: " + com_plante._id + " " + com_plante.Plant);
    } 
  }

我的语法有什么问题?

2 个答案:

答案 0 :(得分:1)

改为使用findOne

var com = Plants.findOne({"Plant": "Thyme"});

findOne返回与选择器匹配的单个数据项。相反,find会返回迭代匹配项的游标。显然,光标本身并不具有与单个项目相同的属性。可以通过fetch()方法将光标转换为项目数组。

答案 1 :(得分:0)

您的第二次搜索(在循环内)基于字符串,但您使用简写进行搜索var com_plante = Plants.findOne(companions[i]);

.find()

.findOne()_id看到单个标量参数时,他们只会检查匹配的var com_plante = Plants.findOne({Plant: companions[i]}); 密钥。

使用:

for