2014-12-04 4 views
3

Я пытаюсь написать запрос Монго, чтобы получить результат, что satisifes условия на всех его поддокумент,MongoDB: Найти документ, который соответствует условию во все его поддокументе

1. { 
    "_id" : 1, 
    "data" : [ 
     { 
      "Id" : "513", 
      "Nom" : "alouale pfouga", 
     } 
    ], 
    "campaigns" : [ 
     { 
      "user" : "1", 
      "latest" : NumberInt(0),    
      "postcode" : [ 
       [ 

       ] 
      ], 
     }, 
     { 
      "user" : "2", 
      "latest" : NumberInt(1), 
      "postcode" : [ 
       { 
        "id" : "772", 
        "name" : "xxx", 
       } 
      ], 

     } 
    ], 

} 

2. { 
    "_id" : 2, 
    "data" : [ 
     { 
      "Id" : "514", 
      "Nom" : "pfouga remi", 
     } 
    ], 
    "campaigns" : [ 
     { 
      "user" : "1", 
      "latest" : NumberInt(0),    
      "postcode" : [ 
       [ 

       ] 
      ], 
     }, 
    ], 

} 

Мне нужно найти запись который имеет массив «Почтовый индекс», пуст. Насколько я понимаю, такой запрос: db.users.find({"campaigns.postcode":[]}) дает мне обе записи, но мне нужно только record 2, потому что record 1 имеет узел почтового индекса в одном дополнительном документе, пожалуйста, помогите мне !!!

+0

Я надеюсь, что обновленный ответ, что вы хотите , Я тестировал и получил правильный результат. – Disposer

ответ

3

Это даст вам ответ:

db.test.find({ 'campaigns.postcode': { $size: 0 } }) 

, но в вашем случае 'campaigns.postcode' имеет пустой массив в нем, и это означает, что размер не 0, его 1

Вы должны удалить пустой массив

"postcode" : [ 
    [ 
    ] 
], 

должен быть

"postcode" : [] 

Обновлено: Потратив некоторое время на вопрос, который я понял проблему

Для преобразования "postcode" : [[]] в "postcode" : [] вы можете использовать этот код:

db.test.find({ 'campaigns.postcode': []}).forEach(function(item){ 
    for(var i0 = 0; i0 < item.campaigns.length; i0++) 
    {   
     if(item.campaigns[i0].postcode[0].length == []) item.campaigns[i0].postcode = []; 
    } 

    db.test.update({'_id' : item._id}, item); 
}); 

после этого вы можете найти надлежащий результат с :

db.test.find({ 'campaigns.postcode': { $size: 0 }, 'campaigns': { $size: 1 } }) 
+0

. Все мои существующие структуры записей, такие как «почтовый индекс»: [[]], как изменить это на «почтовый индекс»: [] –

1

В вашей структуре json содержится

"postcode" : [ [ ] ],

Так что я попробовал некоторые, но не нашли точные, что вы хотите в ожидаемых результатах, которые я нашел почтовый индекс данных, где все почтового индекс был пуст, используя следующую агрегацию

db.collectionName.aggregate({"$unwind":"$campaigns"}, 
    {"$unwind":"$campaigns.postcode"}, 
     {"$match":{"campaigns.postcode":{"$size":0}}}) 
Смежные вопросы