3

几个小时以来,我一直在尝试调试一段代码,将我的头撞到墙上,最后将我的问题定位到代码中将 collection.findOne() 调用的结果分配给变量的地方是给我的数据与我在上一行使用相同 findOne() 的 console.log() 看到的数据不同。

prePostState = function(thisStID) {  
  console.log(Students.findOne({_id:thisStID}));  
  var stTemp = Students.findOne({_id:thisStID});  
  console.log(stTmp);  
  var testsTemp = stTmp.tests;

集合对象有一个“测试”数组。在本例中,数组包含 3 个对象作为其元素。

虽然两个 console.log() 行都返回类似这样的内容

 Object {_id: "eXf9dqQbaemKS24Ti", name: "Student,Name", group: "none", site: "SiteName", tests: Array[3]}  

展开每个显示不同的数据。第一个显示正确的测试:Array[3],第二个显示测试:Array[1],并且该数组中的单个元素也具有与完整数组中的匹配元素不同的数据。

----更新----
做一些进一步的测试,我已经改变了一点代码。

prePostState = function(thisStID) {
  console.log(Students.find({_id:thisStID}).fetch()); //1
  var stTmp = Students.find({_id:thisStID}).fetch();
  console.log(stTmp);                                 //2
  console.log(stTmp[0].tests.length);                 //3
  for(var i = 0; i < stTmp[0].tests.length; i++) {
     console.log(stTmp[0].tests[i]);                  //4
  }  

1 返回:

[Object]
  0: Object
    _id: "AqLHB8hT8GxzQ7zyD"
    group: "none"
    name: "Student,Name"
    site: "SiteName"
    tests: Array[3]

2 回报:

[Object]
  0: Object
  _id: "AqLHB8hT8GxzQ7zyD"
  group: "none"
  name: "Student,Name"
  site: "SiteName"
  tests: Array[1]

3 回报:

3  

4 处的 for 循环重复 3 次,并打印出 tests 数组中的三个对象中的每一个。

显然这意味着我可以访问我需要的数据。代替

var testArray = stTmp.tests;

这给我留下了一个只有一个元素的数组,我只需要获取 stTmp.tests 的长度,然后使用 for 循环按索引访问每个元素并将它们插入到 testArray 变量中。

所以我可以继续,但我仍然不明白我看到的行为。在这一点上,我处于继续取得进展的时间线上,但是当我有时间时,我可能会重新审视它并尝试以流星垫或其他我可以共享完整代码的形式复制它。

4

1 回答 1

0

1)如果你修改了 Minimongo 的返回值,不要指望它会持续存在。Minimongo 是专门以这种方式编写的,因此您不得不使用update运算符来更新值。

2)正确的投影API是Coll.find({..selector..}, {fields:{..projection..}})

于 2015-04-13T22:29:12.487 回答