当前位置: 首页 > 知识库问答 >
问题:

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

师谦
2023-03-14

我正在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个答案

汪翰墨
2023-03-14

您可以使用$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,您可以使用$在哪里运算符来获得相同的结果。尽管它没有利用索引并且可能会影响性能

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
    }
})
 类似资料:
  • 我有一个包含以下数据的文档集合 我想获取具有“管理员”和“用户”角色且状态为“已创建”的用户的文档计数。现在,我正在尝试匹配电子邮件ID和角色。 有什么方法可以比较来自同一对象的数组元素吗?

  • 我有两个对象数组:

  • 问题内容: 我想比较两个数组…理想地,有效地比较。没有什么幻想,只要它们是相同的,如果不相同。毫不奇怪,比较运算符似乎不起作用。 每个数组都可以使用JSON编码,但是有没有一种更快或更“更好”的方法来简单地比较数组而不必遍历每个值? 问题答案: 要比较数组,请遍历它们并比较每个值: 比较数组: 用法: 您可能会说“ 但是比较字符串要快得多-没有循环… ”,那么,您应该注意存在ARE循环。第一个递归

  • 我无法进行数字比较: 问题是,它从第一个数字开始比较数字,即9大于10,但1大于09。 我如何将数字转换成一种类型来进行真正的比较?

  • 问题内容: 在我的收藏夹中,每个文档都有2个修改和同步的日期。我想查找已修改>同步,或不存在同步的内容。 我试过了 但没有显示我的期望。有任何想法吗? 谢谢 问题答案: 您不能将一个字段与具有正常查询匹配的另一个字段的值进行比较。但是,您可以使用聚合框架执行此操作: 我在其中输入“您的其他常规查询”,因为您可以使该位使用索引。因此,如果您只想对该字段所在的文档执行此操作,则可以执行以下操作: 用输

  • 问题内容: 我不知道为什么所有人都打印错误。 当我运行“ java ByteArray”时,答案是“ false false false false”。 我认为a []等于b [],但是JVM告诉我我错了,为什么?? 问题答案: 如果要比较包含基本类型值(例如字节)的数组的实际内容,请使用此选项。 使用了包含对象数组的比较。