【问题标题】:How to find a json object in a json array mongoose如何在 json 数组 mongoose 中查找 json 对象
【发布时间】:2014-05-13 06:22:56
【问题描述】:

我有一个这样的 json 对象数组

[{firstname: "Tom", lastname: "Smith"}, {firstname: "Bob", lastname: "Smith"}]

我想知道该数组中的元素是否位于 User 对象中,该对象的字段名称也包含 json 对象数组。

User 对象的一个​​例子是

{ "names": [{firstname: "joe", "lastname":"smith"}, {"firstname": "john", "lastname":"doe"}]}

我想知道这些名称对象中的任何一个是否包含在一个名为 list2 的随机长度数组中

[{firstname: "Tom", lastname: "Smith"}, {firstname: "Bob", lastname: "Smith"}, {firstname: "Joe", lastname: "Smith"}, {firstname: "Jordan", lastname: "Smith"}, {firstname: "John", lastname: "Smith"}, {firstname: "Bill", lastname: "Smith"}]

我将如何创建一个 mongoose 查询来做到这一点?

谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    假设您正在搜索的数组称为“列表”,如果您的对象始终包含并且仅包含这些字段,您可以使用 $in 运算符来执行此操作

    { 
        "names": {
            "$in": [
                { "firstname": "Tom", "lastname": "Smith" }, 
                { "firstname": "Bob", "lastname": "Smith" }  
            ]
        }
    }
    

    如果这些对象可能会有所不同并具有其他字段,那么您可以使用 $or$elemMatch 来做到这一点:

    {
        "$or": [
            { "names": { 
                "$elemMatch": { "firstname": "Tom", "lastname": "Smith" } 
            }},
            { "names": { 
                "$elemMatch": { "firstname": "Bob", "lastname": "Smith" } 
            }},
        ]
    }
    

    如果您想查找包含两个对象的文档,请将$or 运算符替换为$and

    更新

    您似乎在苦苦挣扎的是如何将其应用到您的程序中。当然,我们实际上从来没有像这样对查询进行硬编码,我们只是使用数据类型来构造它们。因此,如果您的数据实际上符合使用 $in 给出的条件,那么您的代码将如下所示:

    // A list array that you likely actually retrieved from somewhere else
    // so you don't actuall define it here
    
    var list = [
        { "firstname": "Tom", "lastname": "Smith" }, 
        { "firstname": "Bob", "lastname": "Smith" }  
    ];
    
    // and the query "using" the array
    db.collection.find({ "names": { "$in": list } })
    

    如果你需要使用另一种形式,那么“建筑”就变得有点复杂了:

    // A list array that you likely actually retrieved from somewhere else
    // so you don't actuall define it here
    
    var list = [
        { "firstname": "Tom", "lastname": "Smith" }, 
        { "firstname": "Bob", "lastname": "Smith" }  
    ];
    
    var query = { "$or": [ ] };
    
    // process the list to add conditions
    list.forEach(function(item) {
        query["$or"].push({ "names": { "$elemMatch": item } })
    });
    
    // submit the constructed "query" object to find
    db.collection.find( query );
    

    【讨论】:

    • mongoDB 陷阱:{ "firstname": "Tom", "lastname": "Smith" } !== { "lastname": "Smith", "firstname": "Tom" } // 注意顺序!因此,您必须在提到的 $in 方法中包含这两种排列。 $elemMatch 不需要排列(它忽略顺序)。
    • 但这里的问题是我不想列出其他列表,例如 "$in": [ { "firstname": "Tom", "lastname": "Smith" }, { "firstname": "Bob", "lastname": "Smith" } ] 相反,它是一个长度未知的数组,包含多个 firstname 和 lastname 对象。
    • @std 答案的哪一部分没有解决这个问题?你试过了吗?两种形式都不要求您列出所有内容,只列出您想要匹配的项目。
    • 您明确命名对象,如 { "$or": [ { "list": { "$elemMatch": { "firstname": "Tom", "lastname": "Smith " } }}, { "list": { "$elemMatch": { "firstname": "Bob", "lastname": "Smith" } }}, ] }
    • 如果list2,您计划在其中查找列表元素的数组包含一堆名字,姓氏json对象,但您实际上并不确定list2的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2020-03-27
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多