Моно - точка обозначения работает как $ или? Не можете предоставить несколько параметров? - PullRequest
0 голосов
/ 07 декабря 2011

Я попытался обновить существующий документ двумя точечными параметрами, мой запрос:

{ _id: "4eda5...", comments._id: "4eda6...", comments.author: "john" }

мое обновление было:

{ "comments.$.deleted": true }

Однако, как ни странно, когда я пропустил несуществующую комбинацию идентификатора комментария + автора, он просто обновил первый соответствующий комментарий этого автора.

Есть идеи, почему это происходит?

РЕДАКТИРОВАТЬ: C # Пример кода

var query = Query.And(Query.EQ("_id", itemId), Query.EQ("cmts._id", commentId));
if (!string.IsNullOrEmpty(author))
    query = Query.And(query, Query.EQ("cmts.Author", author));

var update = Update.Set("cmts.$.deleted", true);
var result = myCol.Update(query, update, UpdateFlags.None, SafeMode.True);

Ответы [ 2 ]

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

Вы хотите $ elemMatch, если хотите, чтобы _id и author были в одном комментарии. В самом деле, ваш запрос не имеет особого смысла, включая автора, поскольку идентификатор должен быть настолько уникальным, насколько это возможно, не так ли?

Он основан на первом соответствующем элементе массива, который заменяет $ в обновлении.

Это работает по замыслу. Он похож на или так как он может найти документ, который имеет _id и автора, которые совпадают в любом из элементов массива.

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

Запрос работает не так, как вы ожидаете. По сути, при использовании позиционной нотации $ вам нужно убедиться, что в вашем запросе есть только одно предложение, которое запрашивает массив, в противном случае однозначно, к какому из двух сравнений массива следует обращаться в $.

В вашем случае вы запрашиваете документ, в котором:

  1. _id равен некоторому значению
  2. Массив комментариев содержит некоторый документ, где _id равен некоторому значению
  3. Массив комментариев содержит некоторый документ, где автор равен некоторому значению

Ничто в вашем запросе не говорит, что 2. и 3. должны быть удовлетворены одним и тем же документом.

Таким образом, даже если вы используете несуществующую комбинацию comment._id и comment.author, в вашем массиве комментариев есть хотя бы одна запись, в которой _id равен вашему поисковому значению, а некоторые другие записи (но не совпадают 1) где автор равен вашему поисковому значению.

Так как автор был последним проверенным, именно это установило значение $, и именно поэтому этот элемент массива обновился.

...