Hello,
I'm executing an update in this form:
To insert a document in an array only if there isn't one with the same userid (workaround because unique indexes don't work on arrays). The code works fine from mongo console. From my application I'm using this:Code:db.poi.update( {_id: ObjectId("50f40cd052187a491707053b"), "votes.userid":{"$ne": "50f5460d5218fe9d1e2c7b4f"}}, { $push:{votes:{"userid": "50f5460d5218fe9d1e2c7b4f", "value": 1}}, $inc:{"score":1}})
This works fine if as "userid" I use a String that can't be a mongo ObjectId, but if I use the string in the example, the query executed translates like this (from mongosniff):Code: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);
The string is now an Objectid. Is this a bug? Can I work around this using a BasicQuery or I'll get the same result? The only other solution I see is to use ObjectId instead of String for all classes ids.Code:update flags:0 q:{ _id: ObjectId('50f40cd052187a491707053b'), votes.userid: { $ne: ObjectId('50f5460d5218fe9d1e2c7b4f') } } o:{ $inc: { score: 1 }, $push: { votes: { userid: "50f5460d5218fe9d1e2c7b4f", value: 1 } } }
Edit: it's the same with BasicQuery


Reply With Quote