Как использовать $ или с $ lookup в запросе mongodb с помощью go? - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу получить записи данных из документа mongodb, используя $ или и $ lookup.Вот запрос, который я делаю для подтверждения: -

pipeline1 := []bson.M{
    {"$lookup": bson.M{"from": "comment", "localField": "_id", "foreignField": "blog_id", "as": "comments"}},
    {"$addFields": bson.M{"comments": bson.M{"$size": "$comments"}}},
}
pipe1 := getCollection.Pipe(pipeline1)

В приведенном выше запросе он сначала посчитает записи и добавит поле с конкретными данными.Но теперь у меня есть небольшое изменение в запросе: теперь есть еще два параметра, которые мне нужно искать с помощью $ или для регулярного выражения. Я хочу, чтобы функция делала то же самое, но при получении записей, если пользователь введетлюбой параметр затем будет извлекать запись с использованием этого ключевого слова, а также подсчитывать эти данные.

Отредактировано

Я должен объединить вышеуказанный запрос с приведенным нижезапрос: -

query["$or"] = []bson.M{
    bson.M{"title": bson.RegEx{"(?i).*" + value + ".*", "i"}},
    bson.M{"type": bson.RegEx{"(?i).*" + value + ".*", "i"}},
    bson.M{"author": bson.RegEx{"(?i).*" + value + ".*", "i"}},
    bson.M{"tags": bson.RegEx{"(?i).*" + value + ".*", "i"}},
}

Я объединяю это так, но оно ничего не возвращает.

pipeline1 := []bson.M{
    {"$or": []bson.M{
        bson.M{"_id": bson.M{"$in": ids}},
        bson.M{"type": bson.RegEx{"(?i).*" + types + ".*", "i"}},
        bson.M{"category": bson.RegEx{"(?i).*" + category + ".*", "i"}},
        bson.M{"author": bson.RegEx{"(?i).*" + keyword + ".*", "i"}},
        bson.M{"title": bson.RegEx{"(?i).*" + keyword + ".*", "i"}},
        bson.M{"tags": bson.RegEx{"(?i).*" + tag + ".*", "i"}}}},
    {"$lookup": bson.M{"from": "comment", "localField": "_id", "foreignField": "blog_id", "as": "comments"}},
    {"$addFields": bson.M{"comments": bson.M{"$size": "$comments"}}},
}
pipe1 := getCollection.Pipe(pipeline1)

Последнее редактирование

AS @kmdrekoговорят, что я делаю подобное, но не работает: -

 query := bson.M{}
query["$or"] = []bson.M{
    bson.M{"_id": bson.M{"$in": ids}},
    bson.M{"type": bson.RegEx{"(?i).*" + types + ".*", "i"}},
    bson.M{"category": bson.RegEx{"(?i).*" + category + ".*", "i"}},
    bson.M{"author": bson.RegEx{"(?i).*" + keyword + ".*", "i"}},
    bson.M{"title": bson.RegEx{"(?i).*" + keyword + ".*", "i"}},
    bson.M{"tags": bson.RegEx{"(?i).*" + tag + ".*", "i"}},
}
fmt.Println(query)
pipeline1 := []bson.M{
    {"$lookup": bson.M{"from": "comment", "localField": "_id", "foreignField": "blog_id", "as": "comments"}},
    {"$addFields": bson.M{"comments": bson.M{"$size": "$comments"}}},
    {"$match": query},
}
fmt.Println(pipeline1)
pipe1 := getCollection.Pipe(pipeline1)

1 Ответ

0 голосов
/ 12 сентября 2018

Если поля, которые вы фильтруете, находятся в корневом документе, то первый этап должен быть этапом $match. Таким образом, конвейер будет выглядеть так:

{ $match: { $or: [...] } }, // your query
{ $lookup: {...} },         // same as before
{ $addFields: {...} }       // same as before

Удивительно, что ваш запрос не возвращает ошибку, поскольку $or не является стадией конвейера агрегации .

...