我正在尝试让查询正常工作,但是对于我的生活我却陷入困境。
'chat.newDirect': function(otherUser) {
CEChats.collection.find({
$and: [
{
members:{
$elemMatch: {memberId: this.userId}
}
},
{
members:{
// $elemMatch: {memberId: otherUser._id}
$all: {
$elemMatch: {
memberId: otherUser.$._id
}
}
}
}
]
}).fetch();
最初,otherUser是一个单个对象,但现在它已被更改为一个对象数组。
我要做的是找到包含otherUser
数组中所有ID的文档。
otherUser._id
需要匹配members.memberId
数组中的一个元素。
我还希望它只返回具有确切成员列表的文档,所以不要在这些文档之上添加额外内容,所以我还要添加一个长度检查来执行此操作。
〜编辑澄清
otherUser
是传递给函数
[
{_id: 1, fu:'fuu', bar:'baar'},
{_id: 2, fu:'fuu', bar:'baar'},
{_id: 3, fu:'fuu', bar:'baar'}
]
members
是我正在比较的文档中的对象数组。
[
{members: [
{_id: 1, baz:'fuu'},
{_id: 2, baz:'fuu'},
{_id: 3, baz:'fuu'},
{_id: 4, baz:'fuu'},
{_id: 5, baz:'fuu'}
]},
{members: [
{_id: 1, baz:'fuu'},
{_id: 2, baz:'fuu'},
{_id: 3, baz:'fuu'}
]},
{members: [
{_id: 1, baz:'fuu'}
]}
]
运行查询后,只返回第二个对象,因为它是唯一一个包含成员数组中对象中所有成员ID的对象
答案 0 :(得分:1)
var otherIds = [
{_id: 1, fu:'fuu', bar:'baar'},
{_id: 2, fu:'fuu', bar:'baar'},
{_id: 3, fu:'fuu', bar:'baar'}
];
var ids = otherIds.map( oth => oth._id );
CEChats.collection.find({
"members._id": { "$all": ids },
"members": { "$size": ids.length }
}).fetch()
返回第二个结果:
"members" : [
{
"_id" : 1,
"baz" : "fuu"
},
{
"_id" : 2,
"baz" : "fuu"
},
{
"_id" : 3,
"baz" : "fuu"
}
]
因此,您首先使用.map()
来提取_id
值。然后,您可以使用"members._id"
与_id
一起传入,只比较该数组内容的.length
值。另一个约束是您可以从比较数组{{1}}属性获得的确切$all
。