标题可能不太清楚,问题在这里
我正在执行此表单中的更新:
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
在我看来,问题可以这样描述:如果你在类中使用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上的查询转换为相同的问题,