Javascript 仅查找和替换文档中的某些字段
我有这样一份mongo文档:Javascript 仅查找和替换文档中的某些字段,javascript,mongodb,mongodb-query,Javascript,Mongodb,Mongodb Query,我有这样一份mongo文档: { "_id" : "EimL8Hf5SsCQKM7WP", "enable" : "no", "collector" : [ { "name" : "prod", "enable" : "no", "transport" : { "address" : {}, "port" : "8000
{
"_id" : "EimL8Hf5SsCQKM7WP",
"enable" : "no",
"collector" : [
{
"name" : "prod",
"enable" : "no",
"transport" : {
"address" : {},
"port" : "8000",
"protocol" : "http-secure"
},
"authentication" : {},
"notify-syslog" : "yes"
},
{
"name" : "test",
"enable" : "no",
"transport" : {
"address" : {},
"port" : "8000",
"protocol" : "http-secure"
},
"authentication" : {},
"notify-syslog" : "yes"
}
],
"misc" : {
"createdBy" : "someuser",
"updatedBy" : "someuser",
}
}
我向用户显示mongo文档的某些字段,以便对其进行编辑。由于其他字段是隐藏的,因此表单的结果将只包含已公开的字段
我最终得到一个修改过的文档对象,如下所示:(注意“name”字段)
我当前的要求是以某种方式将两个文档合并在一起,以便初始文档具有修改文档的所有字段及其字段
结果:
{
"_id" : "EimL8Hf5SsCQKM7WP",
"enable" : "no",
"collector" : [
{
"name" : "someothername",
"enable" : "no",
"transport" : {
"address" : {},
"port" : "8000",
"protocol" : "http-secure"
},
"authentication" : {},
"notify-syslog" : "yes"
},
{
"name" : "anothername",
"enable" : "no",
"transport" : {
"address" : {},
"port" : "8000",
"protocol" : "http-secure"
},
"authentication" : {},
"notify-syslog" : "yes"
}
],
"misc" : {
"createdBy" : "someuser",
"updatedBy" : "anotheruser",
}
}
如果您注意到上述情况,则仅更新了名称字段,同时保留了其余字段
我试图使用
collection.update({id},$set:{那么这个“内部处理”数据在哪里?在另一个集合中?在内存中?我们如何知道要将它与哪个文档匹配?如何知道它与哪些数组元素匹配?如何知道要“合并”的集合中的元素没有改变?有更多吗?有更少吗?所以你需要更具体地了解所有这些细节。我已经澄清了我的“内部处理”。除了将某些字段作为表单公开给用户并获取表单对象之外,没有什么奇怪的事发生。这里的关键是“数组”元素。在你的“自动表单”中是否有某种东西将您的“name”值与特定数组元素“绑定”在一起?也许您在这里的示例并不是一个真正的指示,因为这里的数组显示的是内容完全相同的“两个”元素。我在这里想要您的实际用例。因为我们不想做的是通过“索引”进行更新或者覆盖现有内容。是的。这里的违规者是一个包含对象的数组。我正在尝试起草一个更详细的用例,我会在某个时候更新。但我可以保证的是数组元素的位置不会改变,所以我不确定按索引更新是否会重新循环。下面是basics。您可以执行“$set”:{“collector.0.name”:“someothername”}
在0
索引处创建属性,而不覆盖其他所有内容。但是使用这样的精确索引是一种不好的做法。理想情况下,我们可以“匹配”改为按条件更新的数组位置。这是您想要的情况。那么,“内部处理”数据在哪里?在另一个集合中?在内存中?我们如何知道要将其与哪个文档匹配?如何知道它与哪些数组元素匹配?如何知道要“合并”的集合中的元素没有改变?有更多吗?有更少吗?所以你需要更具体地了解所有这些细节。我已经澄清了我的“内部处理”。除了将某些字段作为表单公开给用户并获取表单对象之外,没有什么奇怪的事发生。这里的关键是“数组”元素。在你的“自动表单”中是否有某种东西将您的“name”值与特定数组元素“绑定”在一起?也许您在这里的示例并不是一个真正的指示,因为这里的数组显示的是内容完全相同的“两个”元素。我在这里想要您的实际用例。因为我们不想做的是通过“索引”进行更新或者覆盖现有内容。是的。这里的违规者是一个包含对象的数组。我正在尝试起草一个更详细的用例,我会在某个时候更新。但我可以保证的是数组元素的位置不会改变,所以我不确定按索引更新是否会重新循环。下面是basics。您可以执行“$set”:{“collector.0.name”:“someothername”}
,在0
索引处创建属性,而不覆盖其他所有内容。但是使用这样的精确索引是一种不好的做法。理想情况下,我们可以通过标准“匹配”数组的位置以进行更新。这就是您想要的情况。
{
"_id" : "EimL8Hf5SsCQKM7WP",
"enable" : "no",
"collector" : [
{
"name" : "someothername",
"enable" : "no",
"transport" : {
"address" : {},
"port" : "8000",
"protocol" : "http-secure"
},
"authentication" : {},
"notify-syslog" : "yes"
},
{
"name" : "anothername",
"enable" : "no",
"transport" : {
"address" : {},
"port" : "8000",
"protocol" : "http-secure"
},
"authentication" : {},
"notify-syslog" : "yes"
}
],
"misc" : {
"createdBy" : "someuser",
"updatedBy" : "anotheruser",
}
}