【问题标题】:How to find a subfield in Mongo without knowing the parent field?如何在不知道父字段的情况下在 Mongo 中查找子字段?
【发布时间】:2019-10-31 22:30:47
【问题描述】:

给定以下集合:

db.test.insertMany([
    {"_id": 1, "Jimmy": {"Loved by mom": true}},
    {"_id": 2, "Andrew": {"Loved by mom": false}},
    {"_id": 3, "Nicholas": {"Loved by mom": true}}",
    {"_id": 4, "Sarah": {"Loved by dad": true}}
]);

有没有办法在不知道父字段叫什么的情况下搜索所有具有子字段"Loved by mom" 的文档?为了(希望)简化此任务,所需的子字段始终位于深度 1。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    有没有办法搜索所有具有子字段的文档 “被妈妈宠爱”,不知道父字段叫什么?

    这个聚合查询可以做到这一点:

    var loved_by_mom = "Loved by mom";
    
    db.loved.aggregate( [
            { $addFields: { fieldNameValues: { $objectToArray: "$$ROOT" } } },
            { $unwind: "$fieldNameValues" },
            { $addFields: { fldType: { $type: "$fieldNameValues.v" } } },
            { $match: { fldType: "object" } },
            { $addFields: { objs: { $objectToArray: "$fieldNameValues.v" } } },
            { $unwind: "$objs" },
            { $match: { "objs.k": loved_by_mom } }, 
            { $project: { fieldNameValues: 0, fldType: 0, objs: 0 } }
    ] )
    

    【讨论】:

      【解决方案2】:

      string $search from $text,此查询返回在索引主题字段中包含术语 Loved by mom 的文档,或者更准确地说,该词的词干版本:

      db.test.find( { $text: { $search: "Loved by mom" } } )
      

      【讨论】:

        【解决方案3】:

        我不知道一个简单的方法来做你想做的事。

        在你的情况下,我会改变你的文档插入 MongoDB 的方式:

        db.test.insertMany ([
             {"_id": 1, "name": "Jimmy", "lovedBy": {"mom": true}},
             {"_id": 2, "name": "Andrew", "lovedBy": {"mom": false}},
             {"_id": 3, "name": "Nicholas", "lovedBy": {"mom": true}},
             {"_id": 4, "name": "Sarah", "lovedBy": {"dad": true}}
        ]);
        

        然后你可以这样查询:

        db.test.find({"lovedBy.mom" : {$exists: true}});
        

        始终拥有一个允许您以更简单的方式查询信息的文档结构非常重要。

        虽然 MongoDB 允许您拥有灵活的结构,但我不建议使用每个文档都有唯一字段的文档。

        每个文档都有一个唯一字段是没有意义的,而您想搜索这些唯一字段的子字段。

        这样只会妨碍你的工作。

        【讨论】:

          猜你喜欢
          • 2018-01-18
          • 2021-09-18
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多