如何使用 mongodb 中的 ObjectId 更新对象数组中的字符串数组?
How do I update an array of strings within an array of objects using ObjectId in mongodb?
我无法理解如何更新 mongoDB 中数组对象内的标签数组。
我有一个对象数组及其相应的 ObjectID,我想在 mongoDB 上更新哪些标签。我尝试的是使用循环使用 updateOne 将 ObjectID 指定为查询来查找相应的文档。
像这样:
nodes.forEach(node => {
const query = { '_id' : ObjectId(node.Id) }
db.collection(collection).updateOne(
query,
{ $set: { 'tags': value } },
function(err, result) {
if (err) {
throw err;
}
console.log(result);
});
});
不幸的是,这没有用。我尝试了其他方法,但找不到任何有效的方法
我有以下 mongodb 数据结构:
{
"_id": {
"$oid": "6022bc9f9b55276bd39f4e0"
},
"name": "TestProject",
"projectData": {
"nodes": [
{
"data": {
"_id": {
"$oid": "6022bc959b559276bd39f4be"
},
"nodeData": {
"tags": []
}
}
},
{
"data": {
"_id": {
"$oid": "7022bc959b559276bd39f4ce"
},
"nodeData": {
"tags": []
}
}
},
{
"data": {
"_id": {
"$oid": "8022bc959b559276bd39f4de"
},
"nodeData": {
"tags": []
}
}
}
....
]
}
我只想更新与我作为 ObjectID 传入的标签匹配的对象的特定标签。
更新一组匹配特定 ObjectID 的对象值的最佳方法是什么?
您可以使用过滤后的位置运算符 $[<identifier>] 标识与更新操作的 arrayFilters
条件匹配的数组元素。
- 如果您在每个节点 ID 中更新相同的标签而不是尝试
$in
条件,您可以使用 bulkWrite()
操作。
let value = ["tag1", "tag2"];
let nodes = [
ObjectId("6022bc959b559276bd39f4be"),
ObjectId("7022bc959b559276bd39f4ce")
];
db.collection(collection).updateOne(
{},
{ $set: { "projectData.nodes.$[d].data.nodeData.tags": value } },
{
arrayFilters: [
{ "d.data._id": { $in: nodes } }
]
}
)
为了完整起见,我想添加我自己的解决方案。
基于接受的答案,我构建了以下操作,因为每个节点可能有不同的标签,我希望每次都能添加到标签中:
const ObjectID = require('mongodb').ObjectID;
nodes.forEach(node => {
updateOneObjectWithTags(db, node._id, "projectData.nodes.$[d].data.nodeData.tags", node.nodeData.tags, "d.data._id", collection).then(result => {
console.log(result);
});
});
updateOneObjectWithTags: (db, objectId, updateKey, updateValue, arrayFilterKey, collection) => {
return new Promise((resolve, reject) => {
db.collection(collection).updateOne(
{},
{
$set: {
[updateKey] : updateValue
}
},
{
arrayFilters: [
{
[arrayFilterKey]: new ObjectID(objectId)
}
]
})
resolve(true);
});
我无法理解如何更新 mongoDB 中数组对象内的标签数组。
我有一个对象数组及其相应的 ObjectID,我想在 mongoDB 上更新哪些标签。我尝试的是使用循环使用 updateOne 将 ObjectID 指定为查询来查找相应的文档。
像这样:
nodes.forEach(node => {
const query = { '_id' : ObjectId(node.Id) }
db.collection(collection).updateOne(
query,
{ $set: { 'tags': value } },
function(err, result) {
if (err) {
throw err;
}
console.log(result);
});
});
不幸的是,这没有用。我尝试了其他方法,但找不到任何有效的方法
我有以下 mongodb 数据结构:
{
"_id": {
"$oid": "6022bc9f9b55276bd39f4e0"
},
"name": "TestProject",
"projectData": {
"nodes": [
{
"data": {
"_id": {
"$oid": "6022bc959b559276bd39f4be"
},
"nodeData": {
"tags": []
}
}
},
{
"data": {
"_id": {
"$oid": "7022bc959b559276bd39f4ce"
},
"nodeData": {
"tags": []
}
}
},
{
"data": {
"_id": {
"$oid": "8022bc959b559276bd39f4de"
},
"nodeData": {
"tags": []
}
}
}
....
]
}
我只想更新与我作为 ObjectID 传入的标签匹配的对象的特定标签。 更新一组匹配特定 ObjectID 的对象值的最佳方法是什么?
您可以使用过滤后的位置运算符 $[<identifier>] 标识与更新操作的 arrayFilters
条件匹配的数组元素。
- 如果您在每个节点 ID 中更新相同的标签而不是尝试
$in
条件,您可以使用bulkWrite()
操作。
let value = ["tag1", "tag2"];
let nodes = [
ObjectId("6022bc959b559276bd39f4be"),
ObjectId("7022bc959b559276bd39f4ce")
];
db.collection(collection).updateOne(
{},
{ $set: { "projectData.nodes.$[d].data.nodeData.tags": value } },
{
arrayFilters: [
{ "d.data._id": { $in: nodes } }
]
}
)
为了完整起见,我想添加我自己的解决方案。 基于接受的答案,我构建了以下操作,因为每个节点可能有不同的标签,我希望每次都能添加到标签中:
const ObjectID = require('mongodb').ObjectID;
nodes.forEach(node => {
updateOneObjectWithTags(db, node._id, "projectData.nodes.$[d].data.nodeData.tags", node.nodeData.tags, "d.data._id", collection).then(result => {
console.log(result);
});
});
updateOneObjectWithTags: (db, objectId, updateKey, updateValue, arrayFilterKey, collection) => {
return new Promise((resolve, reject) => {
db.collection(collection).updateOne(
{},
{
$set: {
[updateKey] : updateValue
}
},
{
arrayFilters: [
{
[arrayFilterKey]: new ObjectID(objectId)
}
]
})
resolve(true);
});