如何在json数组中找到一个json对象

时间:2014-04-02 06:46:19

标签: node.js mongodb mongoose mongodb-query

我有一个像这样的

的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查询呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

假设您正在搜索的数组称为“列表”,如果您的对象始终包含这两个字段,则可以使用$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 );