我在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标准正在运行)
当我将两者加在一起时,它就会停止有意义。
(希望我可以投票给任何读这篇文章的人:))
任何人都对这里会发生什么有什么想法?
感谢。
答案 0 :(得分:1)
您需要使用$elemMatch
两次,因为嵌入数组深度为2,以匹配正确的嵌入数组元素,
查询应该是
const query = {
groups : {
$elemMatch : { members : { $elemMatch : {user : aUserID, hasAccepted : false} } }
}
};