В Mongo, как определить, насколько глубоко вложен объект? - PullRequest
1 голос
/ 09 июня 2011

Я использую MongoDB для хранения объекта, который содержит подобъект, который [обычно] просто содержит пары имя / значение строк. Мы наблюдаем некоторое повреждение данных, когда объекты становятся более глубокими, чем должны.

Например, это допустимый объект:

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

Мы видим некоторые недопустимые объекты, например:

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

или

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

Я хотел бы написать запрос, чтобы найти все поврежденные значения. Все, где значение в свойстве d является объектом, а не строкой.

Ответы [ 2 ]

1 голос
/ 09 июня 2011
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 голос
/ 09 июня 2011

Кажется, вам нужно просто проверить тип свойства '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 } } );

Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...