[英]MongoDB (Mongoose) - Get only records where nested item is equal to a value
我搜索了很多,嘗試了幾種方法,但沒有任何效果。
我在 mongo 中有這個:
{
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
]
}
}
}
}
}
])
感謝您的回答! 我找到了一個解決方案,如果有人也需要這個,我會在這里發布......
var query = model.aggregate([
{ $match: { '_id': mongoose.Types.ObjectId("1234567890") } },
{
$project: {
answer: {
$filter: {
input: "$answer",
as: "f",
cond: { $eq: ["$$f.deleted", 1] }
}
}
}
}
])
問候!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.