2013-08-21 2 views
1

У меня есть коллекция документов, как этотMongoDB проверить элемент имеет один вложенный атрибут

[ 
{ "name": "pika", "attrs": { "A": 1, "B": 2 ... } }, 
{ "name": "chu", "attrs": { "C": 3 } }, 
{ "name": "plop", "attrs": { "A": 1, "C": 3 } } 
] 

Я хотел бы, чтобы удалить записи, которые имеют «C» и только атрибут «C» в своей «ATTRS» (строка с именем «chu») с использованием mongodb 2.4. Количество возможных атрибутов под ключом attrs возможно велико (> 100).

Я могу использовать несколько запросов.

Как вы это сделаете?

Редактировать: Я хочу сохранить attr C в строках, содержащих другие атрибуты.

ответ

1

У вас есть два варианта. Если пространство ключей мало вы можете сделать

db.collection.remove({C : {$exists:true}, A: {$exists:false}, B: {$exists: false} }) 

В противном случае вам нужно сделать

var col = db.collection.find({C : {$exists:true}}); 
for(doc in col) { 
    var found = false 
    for(key in obj) { 
     if(key !== 'C') { 
      found = true; 
      break; 
     } 
    } 
    if(found === false) { 
     db.collection.remove(doc); 
    } 
} 

Там нет никакого способа, чтобы подсчитать количество ключей в документе непосредственно в MongoDB и нет никакого способа запрос на подстановочные знаки в именах ключей (например, вы не можете сделать), не равных C: {$ exists: false} "). Таким образом, вам нужно либо проверить все ключи явно, либо проверить каждый документ на вашем прикладном уровне.

+0

Я должен был упомянуть, что у меня есть X разных ключей, X большой. Я собираюсь изменить вопрос с этим. Однако оба предложенных вами решения интересны. – greg

1

Если «ATTRS» является массивом, другими словами, вы коллекции, как это:

{ "name": "pika", "attrs": [{ "A": 1}, {"B": 2}] }; 
{ "name": "chu", "attrs": [{ "C": 3 }] }; 
{ "name": "plop", "attrs": [{ "A": 1}, {"C": 3 }] } 

Затем вы можете написать запрос, как показано ниже, чтобы найти конкретную запись вы хотите:

db.entities.find({"attrs.C": {$exists: true}, "attrs": {$size: 1}}); 

Вы можете проверить сайт mongodb, чтобы найти операцию $ size, http://docs.mongodb.org/manual/reference/operator/size/

+0

Я не знал оператора «$ size». Вы отвечаете, к великому сожалению, attrs - это не массив. – greg

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