2016-03-16 4 views
3

MongoDB 3.2 имеет этот красивый validation feature. Тем не менее, в этом документе это только показывает мне, как сделать проверку на полях первого уровня. Если у меня есть следующий внедренный документ для вставки, как я могу установить правило проверки?как проверить mongodb встроенный документ

{"name": { 
      "first_name": "xx", 
      "last_name": "yy" 
     } 
} 

Я попытался следующие, но он не работает,

db.createCollection("name_collection", 
    { validator: { $and: 
     [ 
      {name.first_name: {$type: "string"}}, 
      {name.last_name: {$type: "string"}} 
     ] 
    } 
) 

Спасибо заранее.

ответ

3

Вот тест-кода, он хорошо работает

> db.createCollection('name', {validator: {$and: [{"name.first_name": {$type: 'string'}}, {"name.last_name": {$type: 'string'}}]}}) 
{ "ok" : 1 } 

Кажется, вы должны добавить "" к name.last_name,

Test его с действительными данными

> db.name.insert({name: {first_name: 'xx', last_name: 'yy'}}) 
WriteResult({ "nInserted" : 1 }) 

проверить его с неверными данными

> db.name.insert({name: {first_name: 'xx', last_name: 3}}) 
WriteResult({ 
     "nInserted" : 0, 
     "writeError" : { 
       "code" : 121, 
       "errmsg" : "Document failed validation" 
     } 
}) 

> db.name.find() 
{ "_id" : ObjectId("56e8b644f33ed6e7f3c57f90"), "name" : { "first_name" : "xx", 
"last_name" : "yy" } } 
+0

Большое вам спасибо! Я сделал глупую ошибку ... – yyforyongyu

+0

также, как вы думаете, возможно иметь $ или тип? например, «first_name», может быть «string» или «null»? – yyforyongyu

1

У вас есть пара ошибок в фрагменте кода.

У вашего db.createCollection нет соответствующих патронов. Это должно выглядеть как

db.createCollection("name_collection", { 
    validator: { $and:[ 
    {'name.first_name': {$type: "string"}}, 
    {'name.last_name': {$type: "string"}} 
    ]} 
}) 

Чтобы проверить, если проверка работает или нет, попробуйте вставить частичные данные

db.name_collection.insert({name:{first_name:0, last_name:0}}) 

См Я просто назначая числовое значение First_name и last_name поэтому проверка должна потерпеть неудачу.

После выполнения вышеуказанного запроса он дает следующую ошибку.

WriteResult({ 
    "nInserted" : 0, 
    "writeError" : { 
     "code" : 121, 
     "errmsg" : "Document failed validation" 
    } 
}) 

Но если я назначаю текст, как показано ниже, вставка должна преуспеть.

db.name_collection.insert({name:{first_name:'f_name', last_name:'l_name'}}) 

Результат:

WriteResult({ "nInserted" : 1 }) 

Надежда это то, что вы ищете.

+0

Это именно то, что я искал! Большое спасибо! – yyforyongyu

Смежные вопросы