2011-06-08 35 views
1

我正在使用MongoDB來存儲一個包含[通常]只包含字符串的名稱/值對子對象的對象。我們看到一些數據損壞,其中的對象變得比他們應該變得更加深層嵌套。在Mongo中,我該如何確定一個對象的嵌套深度?

例如,這是一個有效的對象:

{ "_id" : 1, "d": { "a":"foo", "b":"bar" } } 

我們看到了一些無效的對象,如下所示:

{ "_id" : 1, "d": { "a":"foo", "b":{ "c":"bar" } } } 

或:

{ "_id" : 1, "d": { "a":{ "z":"foo" }, "b":"bar" } } 

我想編寫查詢來查找所有損壞的值。任何'd'屬性中的值都是對象而不是字符串。

回答

1
db.foo.find(function() { for (f in this) { var v = this[f]; if (typeof v == "object" && !(v instanceof Array) && !(v instanceof ObjectId) && !(v instanceof NumberLong) && !(v instanceof Date) && !(v instanceof BinData)) return true; } return false; }) 

類型檢查是醜陋的,能不能做到更好?

1

好像你只需要檢查 'B' 屬性的類型:

// matches if 'b' is a string - valid objects 
db.things.find({ "d.b" : { $type : 2 } }); 

// matches if 'b' is a object - invalid objects 
db.things.find({ "d.b" : { $type : 3 } }); 

Documentation

+0

唯一的問題是每次都會損壞確切的值。對於某些對象而言,它是'b'屬性,但對於其他對象而言,它是不同的屬性。 – AgileJon 2011-06-08 22:30:40

+0

@AgileJon:這裏唯一的解決方案是對每個可能「損壞」的屬性運行這樣的查詢,或者使用'$ or'運算符。真的沒有「對象屬性通配符」語法可用。 – 2011-06-09 19:08:44

相關問題