【问题标题】:How to query a document in mongodb comparing fields from an array?如何在 mongodb 中比较数组中的字段来查询文档?
【发布时间】:2016-10-06 01:25:43
【问题描述】:

如果我有这个收藏:

db.createCollection("misMensajes", {max: 100});

以及具有这种分布的文档:

    db.misMensajes.insert(
    {
    "FechaEnvío": new Date("2015-06-22"),
    "Texto": "bla",
    "Destinatarios":[
        {
            "Nombre": "Pepa",
            "Edad": 15,
            "Apodo": "P"
        },
        {
            "Nombre": "Juan",
            "Edad": 16,
            "Apodo": "J"
        }
    ]
    }
);

我想要做的是查询“Destinatarios”“Edad”大于 15 且小于 18 的文档。 我不知道如何查询数组“Destinatarios”的“内部”。我从 mongo 开始,我不明白很多事情。到目前为止,我所拥有的是:

db.misMensajes.find({
    $and:[
        {Edad:{$gt:15}},
        {Edad:{$lt:18}}
    ]
});

但这并没有给我我需要的东西。

【问题讨论】:

    标签: mongodb mongodb-query database nosql


    【解决方案1】:

    请参阅find-doc 以更好地了解如何使用基于数组字段的查找查询。

    要根据大于和小于(根据您的要求)值进行查找,请使用 mongodb 的 $gt 和 $lt。

    所以你可以使用如下:-

    db.misMensajes.find({
    $and: [
        { 'Destinatarios.Edad': { $gt: 15 } },
        { 'Destinatarios.Edad': { $lt: 18 } }
    ]
    }).toArray(function(err, result)
       {
           console.log(results); //results will be an array of objects, containing all the records, which matches the query
        }
    

    注意:- 上述查询将返回与条件匹配的父记录。

    Destinatarios 将拥有所有对象,而不仅仅是匹配查询的对象。

    如果要获取Destinatarios数组的特定对象,则必须使用aggregate。

    【讨论】:

    • 谢谢!真的很有帮助!
    • 很高兴它帮助了你。
    【解决方案2】:

    要在数组内部查询,您需要使用dot notation 作为字段名称,在这种情况下为Destinatarios.Edad:

    db.misMensajes.find({
        $and: [
            { 'Destinatarios.Edad': { $gt: 15 } },
            { 'Destinatarios.Edad': { $lt: 18 } }
        ]
    })
    

    另请注意,在这种情况下您不需要$and:

    db.misMensajes.find({
        'Destinatarios.Edad': { $gt: 15, $lt: 18 }
    })
    

    对于更复杂的查询,您可能需要使用the $elemMatch operator。

    【讨论】:

      【解决方案3】:

      请使用 $elemMatch。这是查询。

      db.misMensajes.find( { Destinatarios: { $elemMatch: { $and:[ {Edad:{$gt:15}}, {Edad:{$lt:18}} ] } } } );

      【讨论】:

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