Запрос на инкремент MongoDB не работает должным образом - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь увеличить голос за комментарий в атомарной операции, поэтому я пытаюсь повысить комментарий к сообщению, если в списке комментариев DownVoters и UpVoters отсутствует текущее имя пользователя. Но приведенный ниже запрос действительно странно иногда работает, но не всегда. Я проверил, что имя пользователя не существует в списке DownVoters и UpVoters, но все еще ниже запрос не работает. Что не так в запросе ниже?

var query = Query.And(Query.EQ("Comments._id", commentId), Query.NotIn("Comments.DownVoters", username));
var update = Update.Push("Commments.$.UpVoters",username).Inc("Commments.$.Score", 1);
collection.Update(query, update);

1 Ответ

1 голос
/ 07 декабря 2011

Ваш код выглядит нормально.Я написал это много раз, и это работает, как ожидалось.Это может быть простой человеческой ошибкой в ​​любом имени поля (как у вас выше, Комментарии -> Комментарии).

Я предлагаю сыграть в mongodb shell , чтобы выяснить точную проблему.

Прежде всего вставьте тестовый документ:

{
  "Comments": [
    {
      "DownVoters": [],
      "Score": 2,
      "UpVoters": [],
      "_id": 1
    },
    {
      "_id": 2,
      "Score": 2,
      "UpVoters": [],
      "DownVoters": []
    }
  ],
  "_id": 1
}

Также я перевел ваш запрос c # в собственный синтаксис mongodb, чтобы вы могли использовать его в оболочке mongodb update .

Ваш запрос:

{"Comments._id": 1, "Comments.DownVoters" : { "$nin" : ["andrew"]},
                    "Comments.UpVoters" : { "$nin" : ["andrew"]} }

Ваше обновление:

{"$push" : { "Comments.$.UpVoters": "andrew" }, 
 "$inc" : {"Comments.$.Score": 1} } 

Попробуйте и вернитесь к нам с ответом, что было проблемой.

...