在我的mongodb查询中,我使用$ addFields添加ID字段,该字段连接其他三个字段。我的问题是,如果我将新添加的字段与我想要查询的值匹配,我就得不到结果。对于其他领域,它们工作得很好。
data = await model.aggregate([
{
$project: {
projectName: 1,
price: 1,
'document': '$$ROOT'
}
},
{
$addFields:{
'document.id': {$concat: ['$document.propertyId.prefix','$document.propertyId.number']}
}
},
{
$match: {
$and: [
{
$or: [
{id: {$regex: '.*' + req.query.search + '.*', $options: "i"}},
{projectName: {$regex: '.*' + req.query.search + '.*', $options: "i"}},
/*This also doesnt work*/
// {'document.id': {$regex: '.*' + req.query.search + '.*', $options: "i"}},
// {'document.projectName': {$regex: '.*' + req.query.search + '.*', $options: "i"}},
]
}
]
}
},
{
$replaceRoot: {newRoot: "$document"}
},
{
$sort: {
[sortBy]: sortType
}
},
]);
答案 0 :(得分:1)
下次请添加您的文档样本,以便人们可以重现您的问题。说过我没看到你的问题在哪里。我创建了一些数据来重现你的用例。所以我添加了以下文档:
{
"_id" : ObjectId("5a0d5d376c9b762a7c035ec4"),
"projectName" : "some stack test",
"price" : NumberInt(45),
"propertyId" : {
"prefix" : "a",
"number" : "7"
}
}
然后我执行了你的脚本(没有排序),它运行正常:
db.yourCollectionName.aggregate([
{
$project: {
"projectName": 1,
"price": 1,
"document": '$$ROOT'
}
},
{
$addFields: {
"document.id": {
$concat: ['$document.propertyId.prefix', '$document.propertyId.number']
}
}
},
{
$match: {
$and: [{
$or: [{
"projectName": {
$regex: '.*' + "some stack test"
}
},
{
"document.id": {
$regex: '.*' + "a" + '.*',
$options: "7"
}
}
]
}]
}
},
{
$replaceRoot: {
newRoot: "$document"
}
}
])
您没有得到结果的事实可能是由于您的请求参数。除了"projectName"
如何与"document.id"
具有相同的搜索参数,它们是否匹配?
再次检查您的匹配管道:
{"projectName": {$regex: '.*' + req.query.search + '.*', $options: "i"}},
{'document.id': {$regex: '.*' + req.query.search + '.*', $options: "i"}}