1

我有以下记录:

Record 1:  
{
    "status": "active",
    "users": [
        {
            "name": "foo",
            "status": "a"
        },
        {
            "name": "foo",
            "status": "b"
        }        
    ]
}

Record 2:  
{
    "status": "active",
    "users": [
        {
            "name": "bar",
            "status": "a"
        },
        {
            "name": "foo",
            "status": "b"
        }        
    ]
}

现在,我希望只返回那些user.name为“foo”且user.status为“a”的记录——也就是说,我需要取回记录 1,因为它满足我的要求。

如何对记录中的数组进行 AND 操作以实现此目的?我尝试了以下查询:

{
    "$and": [
        {
            "users.name": "foo"
        },
        {
            "users.status": "a"
        }
    ]
}

但我得到了两条记录 - 我只需要第一条记录(因为在用户数组中,它有一个名称为“foo”且状态为“a”的条目)。

有什么线索吗?

4

2 回答 2

3

好的,我在这里找到了答案

解决方案是进行如下查询:

{
    "users": {
        "$elemMatch": {
            "name": "foo",
            "status": "a"
        }
    }
}

那成功了!

于 2013-06-19T15:30:51.530 回答
0

除了单个字段值,您还可以在查找查询中使用整个对象。尝试:

db.collection.find( { 
    users: {
         "name":"foo",
         "status":"a"
    }
});

这应该返回用户数组包含一个对象(或者是一个对象)的所有文档,该对象看起来与描述的一样。但请注意,当对象具有其他字段时,这不起作用。

于 2013-06-19T15:12:39.663 回答