我搜索了很多,嘗試了幾種方法,但沒有任何效果。
我在 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"}}}
)
但回傳所有答案.. 你能給我一些幫助嗎?
謝謝!
拉斐爾
uj5u.com熱心網友回復:
一種方法是使用 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
uj5u.com熱心網友回復:
感謝您的回答!我找到了一個解決方案,如果有人也需要這個,我會在這里發布......
var query = model.aggregate([
{ $match: { '_id': mongoose.Types.ObjectId("1234567890") } },
{
$project: {
answer: {
$filter: {
input: "$answer",
as: "f",
cond: { $eq: ["$$f.deleted", 1] }
}
}
}
}
])
問候!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/343593.html
