MongoDB (Mongoose) -只获取嵌套项等于某个值的记录



我搜索了很多,尝试了几种方法,但都不起作用。

我在蒙古有这个:

{
id: ObjectId("1234567890"),
answers: [{
id: 111,
deleted:0
},
{
id: 222,
deleted:0
},
{
id: 333,
deleted:1
}]
},
{
id: ObjectId("0987654321"),
answers: [{
id: 111,
deleted:0
},
{
id: 222,
deleted:1
},
{
id: 333,
deleted:1
}]
}

我想要带有ObjectId("1234567890")的文档,并且只有带有delete = 1的答案(只有id 333)。

我已经试过了:

var query = chatbotMongoModel.find(
{ _id: "1234567890" },
{ answers: {$elemMatch: {deleted: "1"}}}
)

返回所有的答案。你能帮我个忙吗?

谢谢!

拉斐尔

一种方法是使用mongodb聚合框架。

var result = await chatbotMongoModel.aggregate([
{
$match: {
id: "1234567890"
}
},
{
"$unwind": {
path: "$answers"
}
},
{
$match: {
"answers.deleted": 1
}
},
{
$group: {
_id: "$id",
answers: {
$push: "$answers"
},
allFields: {
$first: "$$ROOT"
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$allFields",
{
"answers": "$answers"
}
]
}
}
}
])

请注意,在您的示例文档中,您有id,但您在查询中使用_id,它们必须匹配。另外,deleted数据类型是样本文档中的数字,但您在查询中使用字符串值。

mongoplayground运行。

另一个替代解决方案:

var result = await chatbotMongoModel.aggregate([
{
$match: {
id: "1234567890"
}
},
{
$addFields: {
"answers": {
$filter: {
input: "$answers",
as: "answer",
cond: {
$eq: [
"$$answer.deleted",
1
]
}
}
}
}
}
])

mongoplayground

谢谢你的回答!我找到了一个解决方案,如果有人也需要这个,我就在这里发布…

var query = model.aggregate([
{ $match: { '_id': mongoose.Types.ObjectId("1234567890") } },
{
$project: {
answer: {
$filter: {
input: "$answer",
as: "f",
cond: { $eq: ["$$f.deleted", 1] }
}
}
}
}
])

问候!

相关内容

  • 没有找到相关文章

最新更新