Найти совпадающее содержимое и длину массива в одном внутреннем свойстве

1

Я пытаюсь заставить запрос работать правильно, но для жизни меня я застреваю.

  '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'}
]}
]

После запуска запроса должен быть возвращен только второй объект, поскольку он единственный, который содержит все идентификаторы членов в объектах в массиве-члене

Теги:
meteor

1 ответ

1
Лучший ответ

Вам нужно преобразовать свой источник, а затем передать запрос, используя как $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.

  • 0
    Я только начал делать преобразования после того, как набрал разъясняющую часть. Спасибо за вашу помощь: D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню