如何从 mongoDB 集合中的数组中删除一行
How delete one row from an array in mongoDB collection
我有一个查询集合,它的结构是这样的
{
"_id": "5e71fa3ab004192b349e4a06",
"QUERIES": [
{
"_id": "5e71fa3ab004192b349e4a07",
"QUERY": "1",
"USER_ID": "5e6f1c5b8451307f782d0994",
"USER_NAME": "a1",
"createdAt": "2020-03-18T10:38:50.247Z"
},
{
"_id": "5e71fa46b004192b349e4a08",
"QUERY": "2",
"USER_ID": "5e6f1c5b8451307f782d0994",
"USER_NAME": "a2",
"createdAt": "2020-03-18T10:39:02.451Z"
}
],
"TICKET_ID": "5e70f4fa47df9479502f7937",
"USER_ID": "5e6f1c5b8451307f782d0994",
"RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
}
我想从 QUERIES 数组中删除第一个元素。
预期输出
{
"_id": "5e71fa3ab004192b349e4a06",
"QUERIES": [
{
"_id": "5e71fa46b004192b349e4a08",
"QUERY": "2",
"USER_ID": "5e6f1c5b8451307f782d0994",
"USER_NAME": "a2",
"createdAt": "2020-03-18T10:39:02.451Z"
}
],
"TICKET_ID": "5e70f4fa47df9479502f7937",
"USER_ID": "5e6f1c5b8451307f782d0994",
"RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
}
我尝试使用以下更新方法,但在 mongoDB Shell
上执行更新方法时出现错误
db.getCollection("query_masters").update( {'QUERIES._id':ObjectId('5e726996b96d107eac5c88a4')},{$pull: { 'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4') }}
)
错误信息
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 28,
"errmsg" : "Cannot use the part (_id) of (QUERIES._id) to traverse the element"
})
-提前致谢
错误意味着您不能从子文档id 遍历集合中的主文档。因此,为了避免它,您可以使用父文档的 _id 进行遍历。
试试这个查询:
db
.getCollection("query_masters")
.update(
{
'_id':ObjectId('5e71fa3ab004192b349e4a06')
},
{
$pull: {
'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
}
}
)
如果您仍想使用子文档 ID 遍历文档,试试这个:
db
.getCollection("query_masters")
.update(
{
"QUERIES": {
$elemMatch: {
_id: ObjectId('5e726996b96d107eac5c88a4')
}
}
},
{
$pull: {
'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
}
}
)
首先,我将数据插入到名为 Employee
的集合中,然后将查询编写为:
db.Employee.update({'_id':("5e71fa3ab004192b349e4a06")},
{$pull:{"QUERIES": {USER_NAME:"a1"}}},false, true
);
布尔值是 upsert
和 multi
您可以在文档中查看。我只想建议您在 QUERIES
array
上方的 _id
处使用 ObjectId
。
您的要求不明确。
如果你想删除第一个元素而不考虑内容那么解决方案是
db.collection.updateMany(
{},
{ $unset: { "QUERIES.0": "" } }
)
如果数组中的位置不相关,则解决方案是以下之一:
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { QUERY: "1" } } }
)
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { USER_ID: ObjectId("5e6f1c5b8451307f782d0994") } } }
)
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { _id: ObjectId("5e6f1c5b8451307f782d0994") } } }
)
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { USER_NAME: "a1" } } }
)
我有一个查询集合,它的结构是这样的
{
"_id": "5e71fa3ab004192b349e4a06",
"QUERIES": [
{
"_id": "5e71fa3ab004192b349e4a07",
"QUERY": "1",
"USER_ID": "5e6f1c5b8451307f782d0994",
"USER_NAME": "a1",
"createdAt": "2020-03-18T10:38:50.247Z"
},
{
"_id": "5e71fa46b004192b349e4a08",
"QUERY": "2",
"USER_ID": "5e6f1c5b8451307f782d0994",
"USER_NAME": "a2",
"createdAt": "2020-03-18T10:39:02.451Z"
}
],
"TICKET_ID": "5e70f4fa47df9479502f7937",
"USER_ID": "5e6f1c5b8451307f782d0994",
"RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
}
我想从 QUERIES 数组中删除第一个元素。 预期输出
{
"_id": "5e71fa3ab004192b349e4a06",
"QUERIES": [
{
"_id": "5e71fa46b004192b349e4a08",
"QUERY": "2",
"USER_ID": "5e6f1c5b8451307f782d0994",
"USER_NAME": "a2",
"createdAt": "2020-03-18T10:39:02.451Z"
}
],
"TICKET_ID": "5e70f4fa47df9479502f7937",
"USER_ID": "5e6f1c5b8451307f782d0994",
"RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
}
我尝试使用以下更新方法,但在 mongoDB Shell
上执行更新方法时出现错误db.getCollection("query_masters").update( {'QUERIES._id':ObjectId('5e726996b96d107eac5c88a4')},{$pull: { 'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4') }}
)
错误信息
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 28,
"errmsg" : "Cannot use the part (_id) of (QUERIES._id) to traverse the element"
})
-提前致谢
错误意味着您不能从子文档id 遍历集合中的主文档。因此,为了避免它,您可以使用父文档的 _id 进行遍历。
试试这个查询:
db
.getCollection("query_masters")
.update(
{
'_id':ObjectId('5e71fa3ab004192b349e4a06')
},
{
$pull: {
'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
}
}
)
如果您仍想使用子文档 ID 遍历文档,试试这个:
db
.getCollection("query_masters")
.update(
{
"QUERIES": {
$elemMatch: {
_id: ObjectId('5e726996b96d107eac5c88a4')
}
}
},
{
$pull: {
'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
}
}
)
首先,我将数据插入到名为 Employee
的集合中,然后将查询编写为:
db.Employee.update({'_id':("5e71fa3ab004192b349e4a06")},
{$pull:{"QUERIES": {USER_NAME:"a1"}}},false, true
);
布尔值是 upsert
和 multi
您可以在文档中查看。我只想建议您在 QUERIES
array
上方的 _id
处使用 ObjectId
。
您的要求不明确。
如果你想删除第一个元素而不考虑内容那么解决方案是
db.collection.updateMany(
{},
{ $unset: { "QUERIES.0": "" } }
)
如果数组中的位置不相关,则解决方案是以下之一:
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { QUERY: "1" } } }
)
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { USER_ID: ObjectId("5e6f1c5b8451307f782d0994") } } }
)
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { _id: ObjectId("5e6f1c5b8451307f782d0994") } } }
)
db.collection.updateMany(
{},
{ $pull: { "QUERIES": { USER_NAME: "a1" } } }
)