11

次のコード行と結果を確認してください。

import pymongo

d1 = {'p': 0.5, 'theta': 100, 'sigma': 20}
d2 = {'theta': 100, 'sigma': 20, 'p': 0.5}

I get the following results:

d1 == d2 // Returns True

collectn.find({'goods.H': d1}).count() // Returns 33

collectn.find({'goods.H': d2}).count() // Returns 2

ここで、collectnはMongodbコレクションオブジェクトです。

上記の2つのクエリで同じ結果が得られるようにクエリを実行する設定または方法はありますか?

彼らは本質的に同じ辞書を使用しています(あるという意味でd1 == d2True。私は次のことを行おうとしています。データベースにレコードを挿入する前に、追加されている正確な値の組み合わせを持つレコードがすでに存在するかどうかを確認します。もしそうなら、私は新しいレコードを作りたくありません。しかし、上記の動作により、レコードが存在し、重複するレコードがデータベースに追加された場合でも、レコードが存在しないようにすることが可能になります(もちろん、_idは異なりますが、他のすべての値は同じです。それを持っていない)。

よろしくお願いします。

4

4 に答える 4

6

あなたが抱えている問題は、ここのmongodbドキュメントで説明されています。また、Python辞書は順序付けられておらず、MongoDBオブジェクトは順序付けられたBSONオブジェクトであるという事実とも関係があります。

関連する引用は、

サブドキュメント内の同等性の一致は、サブドキュメントがフィールドの順序を含め、指定されたサブドキュメントと完全に一致する場合にドキュメントを選択します。

3つのプロパティすべてを、サブオブジェクトであるプロパティの1つのコレクションではなく、メインオブジェクトのサブプロパティとして扱う方がよいと思います。このようにして、サブオブジェクトの順序がPythonインタープリターによってクエリに強制されることはありません。

例えば...

d1 = {'goods.H.p': 0.5, 'goods.H.theta': 100, 'goods.H.sigma': 20}
d2 = {'goods.H.theta': 100, 'goods.H.sigma': 20, 'goods.H.p': 0.5}

collectn.find(d1).count()
collectn.find(d2).count()

...より一貫性のある結果が得られる可能性があります。

最後に、より少ないコードを変更してそれを行う方法:

collectn.find({'goods.H.' + k:v for k,v in d1.items()})
collectn.find({'goods.H.' + k:v for k,v in d2.items()})
于 2013-01-14T19:53:39.487 に答える
1

私は2つのことしか考えられません:

  1. クエリを次のように構成します:collectn.find({'goods.H.p':0.5, 'goods.H.theta':100, 'goods.H.sigma':20})。count()。正しい数のドキュメントが見つかります...

  2. データを再構築する->MongoDBを見ると、インデックスの順序とクエリの順序は一致している必要がありますか?p、sigma、thetaでインデックスを作成できるため、クエリで用語の任意の順序で正しい結果が得られます。私の簡単なテスト(私は専門家ではありません)では、現在の構造で同じ効果を生み出す方法でインデックスを作成することができませんでした。

于 2013-01-14T19:54:24.153 に答える
0

$where演算子を探していると思います。

これはノードで機能します:

var myCursor = coll.find({$where: function () {return obj.goods.H == d1}});
myCursor.count(function (err, myCount) {console.log(myCount)});

Pythonでは、 BSONコードオブジェクトを渡す必要があると思います。

ドキュメントでは、$ where演算子はパフォーマンスが低下し、インデックスを使用できないため、最後の手段として使用する必要があると警告しています。

サブプロパティの順序を確立し、可能であれば挿入時または後処理としてそれを適用することは価値があるように思われます。

于 2013-01-14T20:24:51.097 に答える
0

あなたの問題はmongodbdocで言及されていると思います:

フィールドは、順序を含め、サブドキュメントと正確に一致する必要があります。

こちらのドキュメントをご覧ください。サブドキュメントの例があります。

サブドキュメントのフィールドは、照合するクエリと同じ順序である必要があります。

于 2013-01-14T20:03:02.107 に答える