为什么一个Meteor客户端集合的行为与MongoDB中显示的不同?
我一直很高兴通过客户端控制台插入收集文档,并在我的应用程序和命令行MongoDB客户端中浏览这些文档,没有任何问题。。。直到今天,当我通过MongoDB shell用一些新字段修改我的一个集合时,现在我得到了非常奇怪的行为 以下是命令行MongoDB中的一些结果:为什么一个Meteor客户端集合的行为与MongoDB中显示的不同?,mongodb,meteor,Mongodb,Meteor,我一直很高兴通过客户端控制台插入收集文档,并在我的应用程序和命令行MongoDB客户端中浏览这些文档,没有任何问题。。。直到今天,当我通过MongoDB shell用一些新字段修改我的一个集合时,现在我得到了非常奇怪的行为 以下是命令行MongoDB中的一些结果: meteor:PRIMARY> db.pieceSizes.find() { "_id" : "LzZxiwj2i32E9EGnm", "name" : "3C", "length" : 39, "width" : 25.5,
meteor:PRIMARY> db.pieceSizes.find()
{ "_id" : "LzZxiwj2i32E9EGnm", "name" : "3C", "length" : 39, "width" : 25.5, "countedSF" : 7 }
{ "_id" : "AePXzKFgB7M8Ewnf2", "name" : "4C", "length" : 51, "width" : 25.5, "countedSF" : 9 }
然而,当我看到客户机时,我基本上看到了空白文档;当我在JavaScript控制台中运行此命令时:
PieceSizes.find()
。。。然后我展开LocalCollection,我只看到_id,例如:
Object {_id: "LzZxiwj2i32E9EGnm"}
我对芬顿也有同样的结果。为什么在我修改shell中的内容之后,客户端就看不到所有数据了
我正在查找正确的数据库,因为我可以编辑其他集合,并在两端正确查看数据更改
我想有一个完整的解释,但我会满足于简单地让我的应用程序与工作数据再次
更新:我看到有一个流星更新,所以我运行它更新到0.7.0.1,现在它变得更奇怪。如果我对该文档执行findOne,则会得到以下对象:
Object {0: undefined, 1: undefined, 2: undefined, 3: undefined, 4: undefined, 5: undefined, 6: undefined, 7: undefined, 8: undefined, 9: undefined, 10: undefined, 11: undefined, 12: undefined, 13: undefined, 14: undefined, 15: undefined, 16: undefined, 17: undefined, 18: undefined, 19: undefined, 20: undefined, 21: undefined, 22: undefined, 23: undefined, 24: undefined, 25: undefined, 26: undefined, 27: undefined, 28: undefined, 29: undefined, 30: undefined, 31: undefined, 32: undefined, 33: undefined, 34: undefined, 35: undefined, 36: undefined, 37: undefined, 38: undefined, _id: "LzZxiwj2i32E9EGnm"}
没错,它的key _id和前面一样具有预期的值,但现在也有0-38键具有未定义的值。但是MongoDB客户端仍然显示我想要的所有数据,并且没有编号的密钥
因此,我想我会再次尝试在客户端删除和插入数据,但在执行插入时:
PieceSizes.insert({name:"1C", length:88, width:18, countedSF:10})
"YkgoAJehkyZmDbe7G"
。。。我最终得到的输出看起来像一个ID YkgoAJehkyZmDbe7G,但没有定义具有该ID的文档,即findOne不会将其向上拉,而find将在其结果中显示一个没有类似于此ID的游标。但是,我可以在浏览器控制台和命令行shell上看到一个新文档,它只有一个ID:
{ "_id" : ObjectId("52b7d0d81f4f910000000001") }
请注意,它完全删除了我的所有其他信息。除此之外,它的ID与常规的Meteor约定不匹配,也就是说,它创建了典型的Mongo ObjectId。我想我可以使用ObjectId,但如果客户机不保存我的任何数据,也不从数据库中读取任何额外数据,我就无法工作
我想下一步是尝试导出/导入/重新安装数据和工具。欢迎任何解决方法 有几件事 当Meteor插入文档时,它将使用字符串类型_id,如LzZxiwj2i32E9EGnm。从mongo插入时,它通常是ObjectID对象,如ObjectD52B7D0D81F4F910000000001 如果需要,可以在meteor中通过将收藏的idGeneration选项设置为MONGO来完成此操作,例如:
PieceSize = new Meteor.Collection('pieceSizes', { idGeneration : 'MONGO' });
在Meteor中作为字符串执行此操作的原因是,您可以轻松地在URL中使用字符串并将其映射到特定ID。使用ObjectID有点棘手,因为您必须将它们来回转换为字符串
之所以看起来只有_id字段,是因为在发布过程中设置了字段选项,但没有设置。您可以通过添加回自动发布来测试这种情况
`meteor add autopublish`
有几件事会导致你的行为: 未正确发布 如果它在此之后工作,则意味着您的发布规则没有正确设置字段,或者您没有在转换中正确返回文档,这可能是 你需要这样的东西
Meteor.publish("pieces", function() {
return PiecesSize.find({}, fields: { name: true, length: true, countedSF: true });
});
以便发布这些特定字段。在此之后,您可以禁用自动发布
如果未正确设置字段,则只能获得_id字段
不返回变换
如果是这样的转换,甚至使用集合
Docs.find({}. {transform: function(doc) {
doc.value2
return doc
});
如果没有,请不要忘记在转换结束时使用return,您还可以得到just _id的字段作为结果
如果您认为这些都不是问题,那么可能是数据库损坏或其他问题。您可以使用meteor reset重新启动数据库。我找到了它:在对象中使用“长度”属性将严重破坏与数据库的通信 “长度”字段似乎存在已知问题: 以下是症状 通过客户端代码插入,例如浏览器的JavaScript控制台 命令:PieceSizes.insert{name:1C,长度:88,宽度:18,countedSF:10} 预期返回值:一个键,例如YkgoAJehkyZmDbe7G,但该键未与对象一起存储在任何位置,因此无法使用 Mongo shell中显示的存储信息意外:具有单个_id字段的对象,例如{u id:ObjectId52b7d0d81f4f910000000001} 在浏览器客户端中看到的存储信息意外:具有单个_id字段的对象,例如{u id:ObjectId52b7d0d81f4f910000000001} 通过服务器上的Mongo shell插入 命令:db.pieceSizes.insert{name:1C,长度:88,宽度:18,countedSF:10} 预期返回值:无 Mongo shell中显示的存储信息应为:具有生成的_id的对象,例如{u id:Objectd52B85C2D42C8A8DC81BF0331,名称:1C,长度:88,宽度:18,计数SF:10}
在浏览器客户端中看到的存储信息意外:具有一个_id键和88个名为0到87的键的对象;它们都有一个未定义的值。请注意,有一种情况下_id是ObjectId,在我的情况下可能是由meteor升级引起的。感谢您的完整解释!然而,我发现我的问题的一部分是长度属性:在客户机中使用它将提升插入的工作方式。我会在另一个答案中解释更多。我不明白,有解决这个问题的方法吗?我的意思是,我们应该怎么做才能使浏览器mongo与服务器mongo同步?我不明白,有解决这个问题的方法吗?我的意思是,我们应该怎么做才能使浏览器mongo与服务器mongo同步?我不明白,有解决这个问题的方法吗?我的意思是,我们应该怎么做才能使浏览器mongo与服务器mongo保持同步?