Я пытаюсь сделать следующее
Найдите в журнале все призы, введенные пользователем. вернуть номера заказов и название
Я использую структуру агрегации mongo.
Поиск не возвращает никаких элементов
Вот код агрегации
db.pointslogs.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
"user": ObjectId("5aacff47c67f99103bcbf693")
}
},
// Stage 2
{
$group: {
_id: "$productPurchased",
orderNumber: { $push: "$orderNumber" }
}
},
// Stage 3
{
$unwind: {
path : "$orderNumber",
}
},
// Stage 4
{
$lookup: {
"from" : "prizes",
"localField" : "_id",
"foreignField" : "_id",
"as" : "title"
}
},
]
// Created with Studio 3T, the IDE for MongoDB - https://studio3t.com/
);
Вот модели (журнал баллов ниже)
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var schema = new Schema({
orderNumber: {type: String, required: true},
productPurchased: {type: String, require: true},
answer: {type: String},
user: [{type: Schema.Types.ObjectId, ref: 'User'}]
});
module.exports = mongoose.model('PointsLog', schema);
Модель призов ниже
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var schema = new Schema({
title: {type: String, required: true},
content: {type: String, required: true},
orderNumber: {type: String, required: true},
imageUrl: {type: String, required: true},
stockQty: {type: Number, required: true},
question: {type: String, required: true},
answers: [{type: String, required: true}],
image: {type: String, required: true},
cost: {type: Number, required: true },
//entries: {type: Int},
//user: {type: Schema.Types.ObjectId, ref: 'User'}
user: [{type: Schema.Types.ObjectId, ref: 'User'}]
});
module.exports = mongoose.model('Prize', schema);
Не уверен, почему поиск ничего не возвращает
ProductPurchased - это _id приза, но он хранится в виде строки, поэтому я думаю, что вы говорите, что в структуре агрегации вы не можете сопоставить строку с objectId, поэтому лучше при записи журналов хранить как objectId и не нить?
См. Обновить поле MongoDB, используя значение другого поля. Нет другого способа «обновить» поле в коллекции без зацикливания всех документов в коллекции, преобразования в ObjectId через функцию и обратной записи данных.

1)You can use the upgraded lookup
Below is an Example->
db.pointslogs.aggregate([
// Stage 1
{
$match: {
"user": ObjectId("5aacff47c67f99103bcbf693")
}
},
// Stage 2
{
$group: {
_id: "$productPurchased",
orderNumber: { $push: "$orderNumber" }
}
},
// Stage 3
{
$unwind: {
path : "$orderNumber",
}
},
// Stage 4
{
$lookup:
{
from: "prizes",
let: { oNumber: "$orderNumber" },
pipeline: [
{ $match:{ $expr: { $eq: [ "$orderNumber", "$$oNumber" ] } }
}
},
{ $project: {
title: 1,
content: 1,
orderNumber: 1,
imageUrl: 1,
stockQty: 1,
question: 1,
answers: 1,
image: 1,
cost: 1,
user: 1
} }
],
as: "orderNumber"
}
}
])
productPurchased- это «строка», как определено в вашей схеме. Что вы ожидаете от коллекции"prizes"? Если вы думаете, что он «похож» наObjectId, который есть в целевой коллекции, так как это поле_id, то посмотрите еще раз. Строки и значенияObjectidразные, как бы вы их ни "красиво распечатали". Покажите два документа и укажите на то, что вы ожидаете сопоставить, если вы все еще не понимаете.