2

すべてのメッセージを 'jim' の既読としてマークしたいと思います。スレッドの構造は次のとおりです。

db.threads.save({
    messages: [
        {
            read_by: ['bob', 'jim']
        },
        {
            read_by: ['bob']
        },
        {
            read_by: ['bob']
        }
    ]
})

ご覧のとおり、1 つのメッセージは既に 'jim' によって読まれており、残りは 'bob' だけが読んでいます。read_by「jim」が配列に追加されるように、埋め込まれたドキュメントを見つけて変更したいと思います。

これが私が得た場所です:

db.threads.findAndModify({
    query: {
        'messages.read_by': {
            $ne: 'jim'
        }
    },
    update: {
        $push: {
            'messages.$.read_by': 'jim'
        }
    }
})

次のエラーが表示されます。

キャッチされない例外: findAndModifyFailed が失敗しました: 「文字列フィールド名 [$] を使用して配列に追加できません」

クエリは a で機能するdb.threads.find()ため、問題は呼び出しの更新部分にあると思いfindAndModify()ます。

4

2 に答える 2

1

1 回の操作では、まだこれを行うことはできません。この質問を参照してください。これはあなたのものと同じです。

アプリケーションでこの種の操作を行う必要がありfind()ます。ジムがまだ読んでいないすべてのメッセージに彼を追加し、messagesスレッドのフィールドをこの配列に設定します。

于 2013-03-14T12:17:14.500 に答える