MongoDB如何比较关联数组中的字段

时间:2015-05-07 08:17:20

标签: mongodb nosql

我在MongoDB中寻找正确的查询来比较关联数组中的两个值,我有这样的文档:

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

我需要比较futurePrice和price字段,以找到至少有一种格式带有futurePrice>的文档。价

我试过这样的事情:

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

但它似乎没有用,任何想法?

1 个答案:

答案 0 :(得分: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'
                }
            }
        }
])

修改

如评论中提到的@ 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
    }
})