Как найти все документы, которые соответствуют последнему элементу поля массива с заданным значением запроса в Mon goose? - PullRequest
2 голосов
/ 15 января 2020

У меня есть коллекция со структурой, похожей на:

type Products {
       productid: String
       owners: [String]
}

В моем запросе я ввожу значение user. Мне нужно получить все документы, которые соответствуют последнему элементу в owners, надеюсь, используя find. Я попытался Products.find({ "$owners.-1": user }) безуспешно до сих пор

Есть ли способ получить доступ к последнему элементу этого массива?

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Если вы хотите получить только те документы, в которых значение user передано в качестве последнего элемента в массиве owners из коллекции Products, попробуйте следующее:

var user = 'myname';    
Products.find( { $expr: {$eq : [{ $arrayElemAt: [ '$owners', -1 ] }, user]} })

Коллекция Данные:

/* 1 */
{
    "_id" : ObjectId("5e1f82b0d02e05b694b48b9d"),
    "productid" : "1",
    "owners" : [ 
        "others", 
        "myname"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e1f84d3d02e05b694b4cbe0"),
    "productid" : "2",
    "owners" : [ 
        "others", 
        "myname", 
        "anothername"
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e1f84e2d02e05b694b4cee2"),
    "productid" : "3",
    "owners" : [ 
        "myname", 
        "anothername"
    ]
}

/* 4 */
{
    "_id" : ObjectId("5e1f84ebd02e05b694b4d0d0"),
    "productid" : "4",
    "owners" : [ 
        "myname"
    ]
}

Результат:

 /** Only "productid" : "1" & "productid" : "4" are returned */
/* 1 */
{
    "_id" : ObjectId("5e1f82b0d02e05b694b48b9d"),
    "productid" : "1",
    "owners" : [ 
        "others", 
        "myname"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e1f84ebd02e05b694b4d0d0"),
    "productid" : "4",
    "owners" : [ 
        "myname"
    ]
}
1 голос
/ 15 января 2020

Следующее даст вам последний элемент в списке владельцев.

db.Products.find( {}, { owners: { $slice: -1 } } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...