当前位置: 首页 > 知识库问答 >
问题:

Spring数据mongodb查询自动将字符串转换为ObjectId

陈实
2023-03-14

标题可能不太清楚,问题在这里

我正在执行此表单中的更新:

db.poi.update({
  _id: ObjectId("50f40cd052187a491707053b"),
  "votes.userid": {
    "$ne": "50f5460d5218fe9d1e2c7b4f"
  }
},
{
  $push: {
    votes: {
      "userid": "50f5460d5218fe9d1e2c7b4f", 
      "value": 1
    }
  },
  $inc: { "score":1 }
})

仅当没有具有相同用户ID的文档时才在数组中插入文档(解决方法是,唯一索引在数组中不起作用)。代码在mongo控制台上运行良好。从我的应用程序中,我使用以下内容:

@Override
public void vote(String id, Vote vote) {
    Query query = new Query(Criteria.where("_id").is(id).and("votes.userid").ne(vote.getUserid()));
    Update update = new Update().inc("score", vote.getValue()).push("votes", vote);
    mongoOperations.updateFirst(query, update, Poi.class);
}

如果作为“userid”,我使用的字符串不能是mongo ObjectId,那么这很好,但是如果我在示例中使用该字符串,则执行的查询如下所示(来自mongosniff):

update  flags:0 q:{ _id: ObjectId('50f40cd052187a491707053b'), votes.userid: { $ne: ObjectId('50f5460d5218fe9d1e2c7b4f') } } o:{ $inc: { score: 1 }, $push: { votes: { userid: "50f5460d5218fe9d1e2c7b4f", value: 1 } } }

该字符串现在是一个对象。这是虫子吗?BasicQuery做同样的事情。我看到的唯一其他解决方案是对所有类id使用ObjectId而不是String。

有什么想法吗?

更新:

这是投票课

public class Vote {
  private String userid;
  private int value;
}

这是用户类

@Document
public class User {

  @Id
  private String id;
  private String username;
}

这是我正在进行此更新的类和mongo文档

@Document
public class MyClass {

  @Id
  private String id;
  @Indexed
  private String name;
  int score
  private Set<Vote>votes = new HashSet<Vote>();
}

作为Json

{
  "_id" : ObjectId("50f40cd052187a491707053b"),
  "name" : "Test",
  "score" : 12,
  "votes" : [
    {
      "userid" : "50f5460d5218fe9d1e2c7b4f",
      "value" : 1
    }
  ]
}

votes.userid中的Userid被推送为String,但是相同的String被比较为$ne中的ObjectId

共有1个答案

臧兴学
2023-03-14

在我看来,问题可以这样描述:如果你在类中使用String来代替ObjectId,如果你想在其他文档(和嵌入式文档)中使用这些id作为引用(没有dbrefs),它们将被推送为String(它是OK,因为它们是Strings)。这很好,因为Spring数据可以将它们再次映射到对象,但是如果您执行像我提到的那样的查询,这就不好了;在比较中,字段被转换为对象(在本例中为$ne运算符),但在嵌入的文档。因此,总而言之,在我看来,$ne运算符在这种情况下应该将字段视为字符串。

我的解决方案是编写一个自定义转换器,将字符串作为objectid存储在id为引用的文档中

public class VoteWriteConverter implements Converter<Vote, DBObject> {

  @Override
  public DBObject convert(Vote vote) {
    DBObject dbo = new BasicDBObject();
    dbo.put("userid", new ObjectId(vote.getUserid()));
    dbo.put("value", vote.getValue());
    return dbo;
  }
}
 类似资料:
  • 问题内容: MySQL是否会自动将字符串转换为数字值? 转换如何进行? ‘1234’= 1234吗? ‘1abc’= 1? ‘文本’= 1? 给定那是bigint类型的,该查询将如何解释? 问题答案: 前三个问题的答案是:是,是和否。 当字符串转换为数字时,它将成为value 。 描述类型转换的文档在这里。 对于您的查询: 该摘录摘自文档: 在所有其他情况下,将参数作为浮点数(实数)进行比较。 换

  • 我想将MongoDB值字段的字符串转换为整数,然后计算平均值。 这是我的JSON: 但我也得到了这样的输出: {“_id”:ObjectId(“5C509604FC007808C427EDCB”),“values”: [“24.3”,“23.3”,“25.3”,“31.3”,“90.3”],“avgvalue”:null} 期望值应该是values字段的平均值。 我需要对嵌套文档值进行某种转换。

  • 问题内容: 您是否知道可以将Map转换为URL友好的查询字符串的任何实用程序类/库? 例: 我有一张地图: 我想得到: 最终输出 问题答案: 我看到的最可靠的组件是Apache Http Compoments(HttpClient 4.0)的URLEncodedUtils类。 该方法是您所需要的。 它不使用map,因此您可以使用重复的参数名称,例如, 并非我建议使用这种类型的参数名称。

  • 查询:{“日期”:{“$GTE”:“2021-07-22T03:00:00”,“$LTE”:“2021-07-23T03:00:00”},“isdeleted”:false},字段:{},排序:{} 将字符串转换为数据格式,如下所示,我只得到时间戳 DateFormat originalFormatData=new SimpleDateFormat(“yyyy-mm-dd't'hh:mm:ss”,

  • 我的应用程序以JSON格式生成日志。日志如下所示: 目前,我正在将前面提到的日志行推入mongoDB。但是mongoDB将日期时间存储为字符串(这是预期的)。现在,我想在这些日志上运行一些数据处理工作,我更愿意将日期时间存储为mongoDB的原生ISODate数据类型。 我可以想到3种方法来做到这一点: i) 解析每个JSON日志行,将字符串转换为应用程序代码中的ISODate类型,然后插入它。缺

  • 我使用了cakephp Mysql到mongodb查询组件,即将Mysql查询转换到mongodb中,但是当查询有多个括号时代码停止工作,我还尝试将http://www.querymongo.com/site上的查询转换为相同的问题,