2015-05-07 2 views
1

Я ищу нужный поисковый запрос в MongoDB для сравнения двух значений внутри ассоциативных массивов, у меня есть документы, как это:MongoDB Как сравнить поля в ассоциативном массиве

{ 
    "_id" : ObjectId("5502cc4280ee2cd549dee9e8"), 
    "formats" : [ 
     { 
      "name" : "first", 
      "prices" : [ 
       { 
        "futurePrice" : 5.49, 
        "price" : 5.49 
       } 
      ] 
     }, 
     { 
      "name" : "second", 
      "prices" : [ 
       { 
        "futurePrice" : 5.49, 
        "price" : 5.49 
       } 
      ] 
     } 
    ] 
} 

Мне нужно сравнить futurePrice и цены поля, чтобы найти документ, в котором есть хотя бы один формат с futurePrice> цена

Я пытался что-то вроде этого:

Collection.find({'formats.prices': { $elemMatch: 'this.futurePrice > this.price' }}, ... 

Но это, кажется, не работает, какие-либо идеи?

ответ

2

Вы можете сделать это с помощью структуры агрегации $cond оператора:

db.Testing.aggregate([ 
    { 
     '$unwind': '$formats' 
    }, 
    { 
     '$unwind': '$formats.prices' 
    }, 
    { 
     '$project': 
     { 
      formats :1, 
      eq : { 
       $cond: [ { $gt: [ '$formats.prices.futurePrice', '$formats.prices.price' ] }, 1, 0 ] 
      } 
     } 
    }, 
    { 
     $match: { eq: 1 } 
    }, 
    { 
     '$group': 
     { 
      '_id' : '$_id', 
      'formats': 
       { 
        '$push': '$formats' 
       } 
      } 
     } 
]) 

EDIT:

Как @ pepkin88 упоминалось в комментарии вы можете использовать $where оператора, чтобы получить тот же результат. Хотя он не использует преимущества индексов и может повлиять на производительность.

db.Testing.find(function() { 
    for (i = 0; i < this.formats.length; i++) { 
     for (j = 0; j < this.formats[i].prices.length; j++) 
      return this.formats[i].prices[j].futurePrice > this.formats[i].prices[j].price 
    } 
}) 
+0

Да, вы можете использовать оператор '$ where'. Он не оптимизирован и не использует индексы, но работает. – pepkin88

+0

@ pepkin88 вы правы. Спасибо, что указали. Я соответственно изменю свой ответ. – thegreenogre

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