标题可能不是很清楚,这里是问题所在
我正在以这种形式执行更新:
db.poi.update({
_id: ObjectId("50f40cd052187a491707053b"),
"votes.userid": {
"$ne": "50f5460d5218fe9d1e2c7b4f"
}
},
{
$push: {
votes: {
"userid": "50f5460d5218fe9d1e2c7b4f",
"value": 1
}
},
$inc: { "score":1 }
})
仅在没有具有相同用户标识的文档时才在文档中插入文档(解决方法,因为唯一索引不适用于数组).代码在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的String,这可以正常工作,但如果我在示例中使用该字符串,则执行的查询会像这样翻译(来自mongosniff):
update flags:0 q:{ _id: ObjectId('50f40cd052187a491707053b'), votes.userid: { $ne: ObjectId('50f5460d5218fe9d1e2c7b4f') } } o:{ $inc: { score: 1 }, $push: { votes: { userid: "50f5460d5218fe9d1e2c7b4f", value: 1 } } }
该字符串现在是一个Objectid.这是一个错误吗? BasicQuery做同样的事情.我看到的唯一其他解决方案是对所有类ID使用ObjectId而不是String.
有什么想法吗?
更新:
这是投票类
public class Vote {
private String userid;
private int value;
}
这是User类
@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 Setvotes = new HashSet();
}
作为杰森
{
"_id" : ObjectId("50f40cd052187a491707053b"),
"name" : "Test",
"score" : 12,
"votes" : [
{
"userid" : "50f5460d5218fe9d1e2c7b4f",
"value" : 1
}
]
}
将votes.userid中的Userid推送为String,但将相同的String作为$ne中的ObjectId进行比较