假設我們NumberInt在 Mongo-Shell 中有兩個型別的物件:
x = NumberInt(100)
y = NumberInt(100)
當我運行以下比較時,我想知道為什么最后一個比較是false?
x == 100 // True
y == 100 // True
x == y // False! Why?
但是,我確實希望false通過運行以下幾行來獲得:
x === y // False
x === 100 // False
x === 100 // False
這是false預期的。任何想法?
uj5u.com熱心網友回復:
主要原因是相等運算子適用于原始值,但不適用于物件,并且 NumberInt() 函式在 mongoshell 中定義物件:
mongos> x=100
100
mongos> typeof x
number
mongos> y=NumberInt(100)
NumberInt(100)
mongos> typeof y
object
比較物件中的值的一種選擇是通過 mongoshell 中的 JSON.stringify() 將值展平為字串,然后進行比較:
mongos> JSON.stringify(x)===JSON.stringify(y)
true
mongos>
請注意,當您將 NumberInt(100) 物件插入 mongoDB 時,它會轉換為整數,如果您讀回它,它不是物件而是數字型別:
mongos> db.test.insert({a:y})
WriteResult({ "nInserted" : 1 })
mongos> db.test.find()
{ "_id" : ObjectId("6292a16069154745fd5f93c3"), "a" : 100 }
mongos> db.test.aggregate([ {$project:{aType:{"$type":"$a" }}} ])
{ "_id" : ObjectId("6292a16069154745fd5f93c3"), "aType" : "int" }
mongos> var z = db.test.findOne({})
mongos> typeof z.a
number
mongos>
這意味著如果您從 mongoDB 讀取值,則可以毫無問題地與相等運算子進行比較...
uj5u.com熱心網友回復:
我還沒有找到確切的答案,但我猜下面主要是關于這個問題的答案。要了解我們可以查看ObjectId您使用的實作和比較運算子。
MongoDB Enterprise replset:PRIMARY> o1 = ObjectId("507f1f77bcf86cd799439011")
ObjectId("507f1f77bcf86cd799439011")
MongoDB Enterprise replset:PRIMARY> o2 = ObjectId("507f1f77bcf86cd799439011")
ObjectId("507f1f77bcf86cd799439011")
MongoDB Enterprise replset:PRIMARY> o1.equals(o2)
true
MongoDB Enterprise replset:PRIMARY> o1 == o2 # your case 1
false
MongoDB Enterprise replset:PRIMARY> o1 === o2 # your case 2
false
這種行為的原因是在equals實作中你可以看到你是否只是簡單地寫了一個方法名而沒有():
MongoDB Enterprise replset:PRIMARY> o1.equals
function(other) {
return this.str == other.str;
}
請注意,實際比較不是與this(即 ObjectId)發生的,而是與內部的一些欄位發生的:
MongoDB Enterprise replset:PRIMARY> o1.str == o2.str
true
我認為 NumberInt 也會發生類似的事情,只是我還沒有找到。
注意2,它不會影響簡單有效的查詢功能:
MongoDB Enterprise replset:PRIMARY> db.coll.insertOne({a : NumberInt(100), b : NumberInt(100)})
{
"acknowledged" : true,
"insertedId" : ObjectId("62928aae53867e1d4ea6cee4")
}
MongoDB Enterprise replset:PRIMARY> db.coll.find({ $expr: {$eq: ["$a", "$b"]}})
{ "_id" : ObjectId("62928aae53867e1d4ea6cee4"), "a" : 100, "b" : 100 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482943.html
標籤:javascript mongodb 蒙哥壳
