【问题标题】:Find document in mongodb based on value found in array根据数组中找到的值在 mongodb 中查找文档
【发布时间】:2019-12-21 02:36:37
【问题描述】:

在我的 mongodb 集合中,我有一个结构:

A: {var1 : atr1, var2 : atr2, var3 : {key1 :[1], key2 : [2,4,6]}}
B: {var1 : atr1, var2 : atr2, var3 : {key1 :[2,3], key2 : [4]}}
C: {var1 : atr1, var2 : atr2, var3 : {key1 :[3], key2 : [4,5,6]}}

我的目标是根据 key 中的内容来获取 A、B 或 C,但不管它在 key1 还是 key2 中,甚至 key99 是否会走那么远。

我尝试使用

{'var3' : {$elemMatch : {object}}},

{'var3' : {$elemMatch : {$elemMatch : {object}}}}.

结合$all$in$eq,但运行该查询时我会得到。

Fetched 0 record(s) in 1ms

在 mongodb 中有没有办法检查 var3 中的每个数组并返回找到 2 的文档?

在上述结构中,它将是 A 和 B。

【问题讨论】:

  • @srinivasy 抱歉回复晚了,您的解决方案已解决该问题。谢谢

标签: mongodb


【解决方案1】:

不确定你想对你的字段 var3 做什么 A、B 和 C 的性质是什么。 但是如果你想查看数组列表,你可以使用$unwind

db.getCollection("collectionName").aggregate([
        {
            $project : {
                "keyN": "var3", 
            }
        },
        { $unwind : "$keyN"},
        {
            $project : {
                "varName": {$elemMatch : {key : "$keyN"}}, 
            }
        },
        ])

【讨论】:

    【解决方案2】:

    在使用 mongoDB 或大多数编程语言处理对象时,主要是通过 . 表示法。因此,如果您想检查 2 是否作为值存在于 var3 对象的键中,那么您需要指定 'var3.SpecifickeyNo' : {$in :[2]},但是由于您需要直接检查 var3 上的所有键而不指定键编号,那么请试试这个:

    db.YourCollectionName.aggregate([
        { $addFields: { "mergeAsArray": { $objectToArray: "$var3" } } },
        {
            $addFields:
            {
                mergeAsArray:
                {
                    $reduce: {
                        input: '$mergeAsArray.v',
                        initialValue: [],
                        in: { $concatArrays: ["$$value", "$$this"] }
                    }
                }
            } // values of all keys in var3 object are merged into a field mergeAsArray
        }, { $match: { 'mergeAsArray': { $in: [2] } } }, { $project: { mergeAsArray: 0 } }])
    

    参考: $reduce , $concatArrays , $addFields

    收藏:

    /* 1 */
    {
        "_id" : ObjectId("5dfd095e3cd30d038bb4f875"),
        "var1" : "atr1",
        "var2" : "atr2",
        "var3" : {
            "key1" : [ 
                1.0
            ],
            "key2" : [ 
                2.0, 
                4.0, 
                6.0
            ]
        }
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5dfd095e3cd30d038bb4f876"),
        "var1" : "atr1",
        "var2" : "atr2",
        "var3" : {
            "key1" : [ 
                2.0, 
                3.0
            ],
            "key2" : [ 
                4.0
            ]
        }
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5dfd095e3cd30d038bb4f877"),
        "var1" : "atr1",
        "var2" : "atr2",
        "var3" : {
            "key1" : [ 
                3.0
            ],
            "key2" : [ 
                4.0, 
                5.0, 
                6.0
            ]
        }
    }
    

    结果:

    /* 1 */
    {
        "_id" : ObjectId("5dfd095e3cd30d038bb4f875"),
        "var1" : "atr1",
        "var2" : "atr2",
        "var3" : {
            "key1" : [ 
                1.0
            ],
            "key2" : [ 
                2.0, 
                4.0, 
                6.0
            ]
        }
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5dfd095e3cd30d038bb4f876"),
        "var1" : "atr1",
        "var2" : "atr2",
        "var3" : {
            "key1" : [ 
                2.0, 
                3.0
            ],
            "key2" : [ 
                4.0
            ]
        }
    }
    

    根据上述输入值,2 与第一个文档中的 var3.key2 和第二个文档中的 var3.key1 匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2023-02-09
      相关资源
      最近更新 更多