与$ where查询进行自我比较

时间:2012-07-05 20:37:25

标签: mongodb

作为升级脚本的一部分,我想使用$where查找id与其中一个字段匹配的文档。我知道这很慢,因为它是用光标完成的,但对我来说没关系;我只会跑一次。但我无法让它发挥作用:

> 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") }

这里有什么问题?为什么我无法将_idoriginal_id进行比较?

1 个答案:

答案 0 :(得分: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") }

这是a post with much more info on comparison operators in Javascript

这是another article