0

$whereアップグレード スクリプトの一部として、ID がフィールドの 1 つと一致するドキュメントを検索するために使用したいと考えています。カーソルで実行するので遅いことはわかっていますが、私には問題ありません。私はそれを一度だけ実行するつもりです。しかし、私はそれを動作させることができません:

> db.things.drop()
true

> stuff = {}
{ }

> db.things.save(stuff)

> stuff.original_id = stuff._id
ObjectId("4ff5f9f97fadec5abb7b5392")

> db.things.save(stuff)

//why doesn't this return anything?
> db.things.find({$where: "this._id == this.original_id"})

//interstingly, this works fine
> db.things.find({$where: "this._id == this._id"})
{ "_id" : ObjectId("4ff5f9f97fadec5abb7b5392"), "original_id" : ObjectId("4ff5f9f97fadec5abb7b5392") }

ここで何が問題なのですか?と比較できないのはなぜ_idですかoriginal_id?

4

1 に答える 1

1

ObjectIdオブジェクトです。ここで、==演算子は参照の同等性をテストします。

> ObjectId("4ff5fbed3a015a91f85e80bb") == ObjectId("4ff5fbed3a015a91f85e80bb")
false    

ただし、オペランドがより単純な型(数値または文字列)の場合は、値が等しいかどうかをチェックします。

> '4ff5fbed3a015a91f85e80bb' == '4ff5fbed3a015a91f85e80bb'
true

したがって、この簡単な回避策は機能します。

> db.where.find({$where: "this._id.toString() == this.orig_id.toString()"})
{ "_id" : ObjectId("4ff5fbed3a015a91f85e80bb"), "orig_id" : ObjectId("4ff5fbed3a015a91f85e80bb") }

これは、 Javascriptの比較演算子に関するより多くの情報を含む投稿です。

そして、ここに別の記事があります。

于 2012-07-05T20:51:14.183 に答える