Обновление свойства в массиве после запроса с $ ne - PullRequest
0 голосов
/ 04 декабря 2011

Документ в моей коллекции rooms имеет следующую структуру:

{
    "_id": { "$oid": "4edaaa4a8d285b9311eb63ab" },

    "users": [
        {
            "userId": { "$oid": "4edaaa4a8d285b9311eb63a9" },
            "unreadMessages": 0
        },

        {
            "userId": { "$oid": "4edaaa4a8d285b9311eb63aa" },
            "unreadMessages": 0
        },
    ]
}

Я бы хотел увеличить unreadMessages второго пользователя (с индексом 1 в массиве), если я знаю ObjectId пользователя first . Для выбора достаточно знать _id документа, но для обновления мне нужно иметь возможность ссылаться на другого пользователя, поэтому я также выбираю по users. Я делаю это со следующим вызовом обновления:

collections.rooms.update(
    {
        _id: ObjectId("4edaaa4a8d285b9311eb63ab"),

        users: {           // not first user
            $elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } }
        }
    },

    {
        // this should increment second user's unreadMessages,
        // but does so for unreadMessages of first user
        $inc: { "users.$.unreadMessages": 1 }
    }
);

Увеличивает unreadMessages первого пользователя , а не второго пользователя. Я предполагаю, что это потому, что $ne на самом деле совпадает с первым пользователем, и, очевидно, это то, на что ссылается users.$.

Как мне изменить этот вызов так, чтобы unreadMessages второго пользователя был увеличен?

1 Ответ

2 голосов
/ 04 декабря 2011

Я думаю, вы поступаете правильно, за исключением небольшой синтаксической дислексии вокруг ограничения запроса $ ne .

Итак, где у вас есть

users: {           // not first user
    $elemMatch: { $ne: { userId: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}

, вместо этого вы хотите

users: {           // not first user
    $elemMatch: { userId: { $ne: ObjectId("4edaaa4a8d285b9311eb63a9") } }
}

Если бы у меня был никель на каждый раз, когда я делал один и тот же вид обмена ...У меня было бы много никелей.:)

На самом деле, если вы хотите все усложнить, $ elemMatch на самом деле не нужен, так как вы ограничиваете только одно свойство элемента соответствующего массива.Я думаю, что вы можете свести все критерии запроса к:

{
    _id: ObjectId("4edaaa4a8d285b9311eb63ab"),
    users.userId: { $ne : ObjectId("4edaaa4a8d285b9311eb63a9") }
}
...