23

MongoDB に次のようなコレクションがあります。

{
    "_id" : "5327010328645530500",
    "members" : [
        {
            "participationCoeff" : 1,
            "tweetID" : "5327010328645530500"
        },
        {
            "participationCoeff" : 1,
            "tweetID" : "2820402625046999289"
        },
        {
            "participationCoeff" : 0.6666666666666666,
            "tweetID" : "6122060484520699114"
        },
        {
            "participationCoeff" : 1,
            "tweetID" : "4656669980325872747"
        }
    ]
}
{
    "_id" : "2646953848367646922",
    "members" : [
        {
            "participationCoeff" : 1,
            "tweetID" : "2646953848367646922"
        },
        {
            "participationCoeff" : 0.75,
            "tweetID" : "7750833069621794130"
        },
        {
            "participationCoeff" : 0.5,
            "tweetID" : "6271782334664128453"
        }
    ]
}

基本的に、コレクションにはクラスターがあり、クラスターには_idフィールドとフィールドがありmembersます。メンバー フィールドは、次の形式を持つドキュメントの配列です。

{
            "participationCoeff" : 1,
            "tweetID" : "5327010328645530500"
        }

ここで、ときどき、つぶやき ID を照合して、クラスター ドキュメントの members 属性でこれらのサブドキュメントを削除する必要があります。

ただし、この効果を達成するためのクエリを見つけることができません。基本的に、つぶやきIDは多くのクラスターに参加するため、さまざまなクラスターの「メンバー」属性の複数のサブドキュメントに表示されます。特定の tweetID に一致するすべてのクラスター (つまり、それらの members 属性) 内のすべてのサブドキュメントを削除できる一括 $pull 操作を提供したいと考えています。

いくつかの助けと直感は本当に役に立ちます。

4

4 に答える 4

41

それはまさにオペレーターが行うことなので、シェルでは次のようなもの$pullを使用できます。update

db.clusters.update({}, 
    {$pull: {members: {tweetID: '5327010328645530500'}}}, 
    {multi: true})

multi最初のドキュメントだけでなく、すべてのドキュメントが更新されるようにオプションを設定します。

于 2013-02-27T20:44:24.837 に答える
10

multiple tweetsこれは、配列を渡すだけで単一のクエリで削除されます$in:-

db.clusters.update({}, 
{$pull: {members: {$in: [ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ] } } }, 
{multi: true});

上記の方法はマングースでは機能しないため、マングースの場合は次のようにします。

 db.clusters.update({}, 
{$pull: {members:[ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ]  } });
于 2016-09-13T08:01:05.230 に答える