Я пытаюсь заставить запрос работать правильно, но для жизни меня я застреваю.
'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 был единственным объектом, но теперь он был изменен как массив объектов.
Я пытаюсь найти документы, которые имеют все ID в массиве otherUser
.
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'}
]}
]
После запуска запроса должен быть возвращен только второй объект, поскольку он единственный, который содержит все идентификаторы членов в объектах в массиве-члене
Вам нужно преобразовать свой источник, а затем передать запрос, используя как $all
и $size
:
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
. Затем вы можете пройти с $all
с помощью "members._id"
чтобы просто сравнить значение _id
этого содержимого массива. Другим ограничением является точный $size
который вы можете получить из свойства array .length
.