当前位置: 首页 > 面试题库 >

在Spring + Mongo中从文档数组中删除项目

凌黎明
2023-03-14
问题内容

我在mongo db中有这样的文档集合

"_id" : ObjectId("592bc37c339e7a23788b4c7c"),
"trips" : [ 
    {
        "tripGcsId" : "5937f86e339e7a2a58ac3186",
        "tripCounter" : NumberLong(1283),
        "tripRef" : "hjkhjk"
    }, 
    {
        "tripGcsId" : "5937f914339e7a2a58ac318b",
        "tripCounter" : NumberLong(1284),
        "tripRef" : "fjh"
    }
]

和服务器端的方法(Spring + Mongo):

public List<String> removeTripObject( List<String> tripIds )
{
    Query query = Query.query( Criteria.where( "trips" ).elemMatch( Criteria.where( "tripGcsId" ).in( tripIds ) ) );

    Update update = new Update().pullAll( "trips.tripGcsId", new Object[] { tripIds } );
    getMongoTemplate().updateMulti( query, update, "ORDER" );
    return updatedOrders;
}

该参数tripIds是要从trips数组中删除的tripGcsId的列表。上面的方法给我错误:Write failed with error code 16837 and error message 'cannot use the part (trips of trips.tripGcsId) to traverse the element.

当我尝试使用$运算符时,如其他SO所述,答案如下:

public List<String> removeTripObject( List<String> tripIds )
{
    Query query = Query.query( Criteria.where( "trips" ).elemMatch( Criteria.where( "tripGcsId" ).in( tripIds ) ) );

    Update update = new Update().pullAll( "trips.$.tripGcsId", new Object[] { tripIds } );
    getMongoTemplate().updateMulti( query, update, "ORDER" );
    return updatedOrders;
}

我收到此错误: Write failed with error code 16837 and error message 'Can only apply $pullAll to an array.

我不确定这个pullAll命令在服务器端应该是什么样子。


问题答案:

您需要使用$pull更新运算符,该运算符将查询用于匹配并删除嵌入式数组中的所有匹配行。

就像是

public List<String> removeTripObject( List<String> tripIds ) {
    Query query = Query.query( Criteria.where( "tripGcsId" ).in( tripIds ) );
    Update update = new Update().pull("trips", query );
    getMongoTemplate().updateMulti( new Query(), update, "ORDER" );
    return updatedOrders;
}

参考

https://docs.mongodb.com/manual/reference/operator/update/pull/#remove-items-
from-an-array-of-
documents



 类似资料:
  • 问题内容: 我正在尝试从猫鼬文档中存储的集合中删除一项。我的文档如下所示: 我想删除SKU为12的金鱼。我正在执行以下操作: 当我这样做时,出现错误“ TypeError:无法读取未定义的属性’等于’”。我不明白为什么。 问题答案: 您需要,然后打个电话。用于顶级文档

  • 问题内容: 我使用下面的代码行遍历数据库中的一个表: 如果我打印出数组: 我会得到这个: 但是我想摆脱数组中的重复项,所以我使用 我得到下面的奇怪结果,这不是我想要的结果: 理想情况下,我认为它应该返回以下内容: 我该怎么做才能正确处理?我使用了错误的PHP语法/默认功能吗? 问题答案: 该功能将为您完成此操作。您只需要添加标志:

  • 问题内容: 故事是,我应该能够将鲍勃,莎莉和杰克放进盒子里。我也可以从包装盒中取出。卸下后,将不留任何插槽。 我现在需要删除“鲍勃”。新的数组将是: 这是我的反应成分: 在这里,我向您展示了一个最少的代码,因为它包含更多内容(onClick等)。关键部分是从数组中删除,删除,销毁“ Bob”,但调用时不起作用。有任何想法吗?我一直在看这个,但由于使用React,所以我可能做错了。 问题答案: 要从

  • 所以,我有两个多维数组。 数组值示例: 这就是我想要的 我想从组合中获得所有唯一的数组,并用它填充唯一的组合。 我尝试了这个函数,但它只填充了5个数组,真奇怪!

  • 问题内容: 我应该读一个包含许多不同电子邮件地址的文件,并使用数组将它们打印出来。问题是我需要消除重复的电子邮件。 我能够尝试/捕捉并打印出电子邮件地址。但是,我不确定如何删除重复项。我对散列码或如何使用Set尚不了解。任何援助将不胜感激。 这是我到目前为止的内容: 问题答案: 简单的解决方案是使用Set Java, 因此设置自动删除重复值 并且在你的代码中你拥有数组,而不是将转换数组直接使用代码

  • 问题内容: 我有以下数组。 我想删除最后一个元素,即2。 我用过,但不会删除值。 问题答案: 使用拼接(索引,多个)