Spring data и mongoDB-агрегация со списком java

У меня есть следующий документ (@Document):

@Id
private String id;
private String fileName;
private String projectId;
private List<DocumentFileVersion> documentFileVersions;
private List<String> userIdBlackList; // here userIds are included

и это моя текущая агрегация:

final String userId = "5589929b887dc1fdb501cdbb";
final Aggregation aggregate = newAggregation(match(Criteria.where("projectId").in(projectId)),
        group("fileName").count().as("amountOfDocumentFiles"));
    final AggregationResults<DocumentFileAmount> groupDocumentFiles = mongoTemplate.aggregate(aggregate, DocumentFile.class,
        DocumentFileAmount.class);
    final List<DocumentFileAmount> documentFileAmounts = groupDocumentFiles.getMappedResults();
    final int amountOfDocumentFiles = documentFileAmounts.size();

Теперь я расширю аггрегацию таким образом, что у меня будут только DocumentFiles, где userId (в данном случае «1234») не находится в userIdBlackList .
Есть ли возможность сделать это, как в псевдокоде:

final Aggregation aggregate = newAggregation(match(Criteria.where("projectId").in(projectId).and(userId).notInList("userIdBlackList")),
    group("fileName").count().as("amountOfDocumentFiles"));

Мне нужно что-то вроде этого: … .and (userId).notInList («userIdBlackList»)…

[EDIT]
Я пробовал этот запрос:

final Aggregation aggregate = newAggregation(
        match(Criteria.where("projectId").in(projectId).and(userId).and("‌​userIdBlackList").ne(userId)),
        group("fileName").count().as("amountOfDocumentFiles"));

Запись базы данных может выглядеть следующим образом:

{
"_id" : ObjectId("587e7cabafdaff28743f3034"),
"_class" : "com.smartinnotec.legalprojectmanagement.dao.domain.DocumentFile",
"fileName" : "Hydrangeas.jpg",
"projectId" : "587e7c95afdaff28743f302e",
"userIdBlackList" : [
    "5589929b887dc1fdb501cdbb"
    ]
}

но …and (userId).and («userIdBlackList»).ne (userId) не имеет эффекта.

[EDIT2]

Я также пытался смоделировать его в консоли mongo.
Я перечислил все documentfiles с командой db.DocumentFile.находить.)(pretty():

db.DocumentFile.find().pretty()
{
"_id" : ObjectId("587f0d61473c92b933a68efa"),
"_class" :   "com.smartinnotec.legalprojectmanagement.dao.domain.DocumentFile",
"fileName" : "DocumentFile1",
"ending" : "jpg",
"projectId" : "587f0d61473c92b933a68ef9",
"active" : true,
"userIdBlackList" : [
    "587f0d61473c92b933a68ef8"
]}

и мой запрос выглядит так:

db.DocumentFile.aggregate({ "$match" : { "projectId" : { "$in" : [ "587f0d61473c92b933a68ef9"]} , "‌​userIdBlackList" : { "$ne" : "587f0d61473c92b933a68ef8"}}}).pretty();
{
"_id" : ObjectId("587f0d61473c92b933a68efa"),
"_class" : "com.smartinnotec.legalprojectmanagement.dao.domain.DocumentFile",
"fileName" : "DocumentFile1",
"ending" : "jpg",
"projectId" : "587f0d61473c92b933a68ef9",
"active" : true,
"userIdBlackList" : [
    "587f0d61473c92b933a68ef8"
]}

Я ожидал, что не получу documentfile из-за этого выражения «userIdBlackList»: {«$ne»: «587f0d61473c92b933a68ef8»}
Кто-нибудь знает, что я делаю неправильно?

[EDIT3]

У меня есть эти два документа и с aggegate:

final Aggregation aggregate = newAggregation(
            match(Criteria.where("projectId").in(projectId).and("‌​userIdBlackList").nin(userId)),
            group("fileName").count().as("amountOfDocumentFiles"));

Я получаю сумму 2, но она должна 1. Я не знаю, что я делаю неправильно?

db.DocumentFile.find().pretty()
{
"_id" : ObjectId("587f2228e232342f74b166f9"),
"_class" : "com.smartinnotec.legalprojectmanagement.dao.domain.DocumentFile",
"fileName" : "DocumentFile1",
"ending" : "jpg",
"projectId" : "587f2228e232342f74b166f8",
"active" : true,
"userIdBlackList" : [
    "587f2228e232342f74b166f7"
]}
{
"_id" : ObjectId("587f2228e232342f74b166fa"),
"_class" : "com.smartinnotec.legalprojectmanagement.dao.domain.DocumentFile",
"fileName" : "DocumentFile2",
"ending" : "jpg",
"projectId" : "587f2228e232342f74b166f8",
"active" : true,
"userIdBlackList" : [ ]
}

1 ответ

  1. Вы пробовали использовать .nin

    final Aggregation aggregate = newAggregation(
                    match(Criteria.where("projectId").in(projectId).and("‌​userIdBlackList").nin(userId)),
                    group("fileName").count().as("amountOfDocumentFiles"));