Mongoose.js查询条件不适用于布尔和对象ID搜索

时间:2018-02-01 04:19:22

标签: mongodb mongoose

我在Mongoose 4.11中看到了一些奇怪的行为。

问题是我收到的文件是我认为不应该的。请参阅下面的代码后的具体细节。

(很抱歉,长篇代码片段......在谈论数据库时很难,因为你需要模型,数据,查询和结果,对吗?)

这是模特:

const UserSchema = new Schema({
firstName: {
    type: String
},
lastName: {
    type: String
}
groups: [
    {
        name: String,
        members: [
            {
               user: {
                   type: Schema.Types.ObjectId, ref: 'User'
               },
                hasAccepted: {
                    type: Boolean,
                    default: false
                }
            }
        ]
    }
]
});

查询:

const query = {
    'groups.members.user':aUserID, // '5a712ca2db684000102e51b7' in this case
    'groups.members.hasAccepted':'false'
};

const fields = 'firstName lastName groups.name';

User.find(query, fields, function(err, result){
    res.send(result);
});

和数据集(省去不必要的名称和id字段):

[
{
    "groups": [
        {
            "name": "Test Group",
            "members": [
                {
                    "user": {
                        "$oid": "5a712ca2db684000102e51b7"
                    },
                    "hasAccepted": false
                },
                {
                    "user": {
                        "$oid": "5a7141fb5b19bb0011e27658"
                    },
                    "hasAccepted": false
                }
            ]
        }
    ]
},
{
    "groups": [
        {
            "name": "Test Group 2",

            "members": [
                {
                    "user": {
                        "$oid": "5a712ca2db684000102e51b7"
                    },
                    "hasAccepted": true
                },
                {
                    "user": {
                        "$oid": "5a7141fb5b19bb0011e27658"
                    },
                    "hasAccepted": false
                }
            ]
        }
    ]
}
]

我希望只返回测试组,而不是测试组2,因为我的查询只查找用户ID匹配且hasAccepted属性为false的组。

但是,我让两个小组都回来了。

我已经尝试过很多方法来确认查询是否正确设置。

例如,如果我删除用户ID,我将从测试组2中查找并将查询更改为:

const query = {
    'groups.members.user':aUserID, // '5a712ca2db684000102e51b7' in this case
    'groups.name':'Test Group 2'
};

我没有得到任何回复(这证实它不是" OR"游戏中的操作员)

如果我将查询更改为:

const query = {
    'groups.members.hasAccepted':true
};

我只返回测试组2(这证实我的hasAccepted标准正在运行)

当我将两者加在一起时,它就会停止有意义。

(希望我可以投票给任何读这篇文章的人:))

任何人都对这里会发生什么有什么想法?

感谢。

1 个答案:

答案 0 :(得分:1)

您需要使用$elemMatch两次,因为嵌入数组深度为2,以匹配正确的嵌入数组元素,

查询应该是

const query = {
    groups : {
        $elemMatch : { members : { $elemMatch : {user : aUserID, hasAccepted : false} } }
    }
};