6

: コードの実行には mongodb シェルを使用してください。

以下のような生徒用ドキュメントが 1 つあるとします。

{
    "_id" : 4,
"grades" : [
    {
        "grade" : 80,
        "mean" : 75,
        "std" : 8
    },
    {
        "grade" : 85,
        "mean" : 90,
        "std" : 5
    },
    {
        "grade" : 85,
        "mean" : 90,
        "std" : 5
    },
    {
        "grade" : 85,
        "mean" : 95,
        "std" : 6
    },
    {
        "grade" : 90,
        "mean" : 85,
        "std" : 5
    }
]
}

2 つの問題があります。

問題 1 : すべてのサブドキュメントを _id=4 && grades.grade = 85 && grades.std = 5 で更新したい場合、std=6 の場合、次のように記述します。

db.students.update( {'$and':[ { _id: 4},{ "grades.grade": 85 }, {"grades.std": 5 } ]}, { $set: { "grades.$.std" : 6 } } );

上記のステートメントを複数回 (3 回) 実行すると、理想的には 2 番目、3 番目のサブドキュメントを更新する必要があります。

しかし、std=5 の一致があるため、最後のサブドキュメントも更新されますが、条件を$ orではなく$ として指定した場合、最後のドキュメントが更新されるのはなぜですか?

問題 2 : ここで、クエリ条件に一致するサブドキュメント自体を削除したいとします。次のステートメントを試しました

db.students.update({_id:4,'grades.grade':85},{'$unset':{'grades.$':1}})

$unset はサブドキュメント/配列の場合に null を入れるため、この問題を解決するにはどうすればよいですか?

mongodb コンソールで複製する方法は?

db.students.insert( { "_id" : 4, "grades" : [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 90, std: 5 }, { grade: 85, mean: 95, std: 6 }, { grade: 90, mean: 85, std: 5 } ] });
4

4 に答える 4

2

配列内で一致させるには$elemMatchを使用する必要があります。MongoDB のクエリ ルールでは、配列要素の条件について、いずれかの条件が一致する配列要素が一致と見なされることが指定されています。では$elemMatch、すべての条件が同じ要素で一致する必要があります。

于 2013-08-21T11:17:53.777 に答える
0

問題 #1 については、https ://stackoverflow.com/a/20601288/773953 を参照してください。

基本的に、手動で設定したいものの配列を構築する必要があります。

于 2014-03-11T14:50:59.470 に答える
0

ドット表記は、その基準が配列要素のいずれかで満たされるドキュメントと一致します。

1 つの配列要素内のすべての条件に一致するドキュメントのみを (少なくとも) 一致させたい場合は、drmirrorが既に応答しているため、演算子 $ を使用する必要がありますelemMatch。以下も参照してください: $elemMatch 演算子

あなたの場合、それは次のようになります:

db.students.update( {'$and':[ { _id: 4},{ "grades":{"$elemMatch": {"grade": 85, "std": 5 }}} ]}, { $set: { "grades.$.std" : 6 } } );

ご質問の 2 番目の部分である、配列要素を削除する方法については、次の投稿を参照してください。

mongoDbでは、インデックスで配列要素をどのように削除しますか

つまり、最初nullに要素を設定し (既に行っているように)、それを $ pull(s) オフにする 2 段階の操作です。

于 2013-08-21T12:32:59.107 に答える