我正在使用Node.js(使用原生MongoDB驱动程序)设置和更新一些MongoDB的封闭集合。我的目标是在运行app.js时向封闭集合中插入文档,并更新现有文档。这两个任务都在setInterval()上运行,所以每隔几秒钟执行一次。
我的问题:
1.如果集合不存在,我想创建一个集合,但如果它存在,我想插入一个文档。正确的检查方法是什么?
2.对于封闭集合,我是否应该在插入任何内容之前明确创建它们?通常情况下,我认为您可以直接将内容插入集合而无需事先明确创建它们,但在这种情况下,我需要确保它们是封闭的。一旦封闭集合存在,我知道如何将新文档插入其中,问题是我需要某种方式处理首次使用应用程序(在新服务器上)的情况,其中集合不存在,并且我希望使用节点进行此创建,而不必跳转到mongo cli。
3.关键在于集合需要被封闭,因此我可以做类似以下操作:
4.另一种选择是使用以下内容将集合转换为封闭集合:
5.您要使用什么类型的查询来查找集合中的第一个文档?同样,在mongo cli中,我可以使用
6.如何使用
我的问题:
1.如果集合不存在,我想创建一个集合,但如果它存在,我想插入一个文档。正确的检查方法是什么?
2.对于封闭集合,我是否应该在插入任何内容之前明确创建它们?通常情况下,我认为您可以直接将内容插入集合而无需事先明确创建它们,但在这种情况下,我需要确保它们是封闭的。一旦封闭集合存在,我知道如何将新文档插入其中,问题是我需要某种方式处理首次使用应用程序(在新服务器上)的情况,其中集合不存在,并且我希望使用节点进行此创建,而不必跳转到mongo cli。
3.关键在于集合需要被封闭,因此我可以做类似以下操作:
db.createCollection("collectionName", { capped : true, size : 100000, max : 5000 } )
。这将为我创建封闭集合,但每次调用它都会调用createCollection(),而不是更新或插入——如果我调用createCollection(),一旦集合已经存在,它会完全覆盖现有集合吗?4.另一种选择是使用以下内容将集合转换为封闭集合:
db.runCommand({"convertToCapped": "collectionName", size: 100000, max : 5000 });
。问题在于node不认为runCommand()是一个有效的函数,并且会出现错误。我是否需要调用其他内容才能使其正常工作?它在mongo cli中可以工作,但在节点中无法正常工作。5.您要使用什么类型的查询来查找集合中的第一个文档?同样,在mongo cli中,我可以使用
db.collections.find()
与某个查询,但在节点中,它指出find()不是有效的函数。6.如何使用
collection.update()
向现有文档添加一些新字段?假设文档是一些简单对象,例如{key1: "value", key2: "value"}
,但我有一个包含{key3: "value"}
的对象。键3不存在于当前文档中,我应该如何将其添加到当前存在的文档中?这与上面的#4有些相关,因为我不确定在query参数中传递什么,因为find()似乎不能很好地与node配合使用。
dataObject = {"timeCollected": 3432547, "publicIP": {"ip": "xx.xxx.xx.xx"} (...加上许多其他内容) }
。然后我从中提取一些值到一个新对象中:systemInfo = {"timeCollected": dataObject.timeCollected, "publicIP": dataObject.publicIP.ip,}
。我想要更新现有文档中的timeCollected和publicIP字段(这两个字段最初在文档中都设置为0)。 - Simoncollection.update(query, {"$set": systemInfo}, function(err, result) {}
的东西,但是没有一个字段更新。奇怪的是,如果我只尝试更新timeCollected,那么它就可以正常工作,但是尝试同时更新两个字段或者仅更新publicIP都不起作用。 - SimonsystemInfo = {"timeCollected": 55, "publicIP": 5}
,那么两个字段都会更新。因此,这似乎与从嵌套对象中提取值有关? - Simon