我有一個集合,它的檔案如下所示:
{
_id: ObjectId('111111111122222222223333'),
my_array: [
{
id: ObjectId('777777777788888888889999')
name: 'foo'
},
{
id: ObjectId('77777777778888888888555')
name: 'foo2'
}
//...
]
//more attributes
}
但是,某些檔案具有my_array: [{}](一個元素是空陣列)。
如何有條件地添加或洗掉投影?
我必須在查詢結束時將它添加到 mongo 管道中,并且我只想在它至少有一個不是空物件的元素時才獲取my_array。如果有一個空物件將其洗掉。
我試著用$cond和$eq在投影階段,但它不支持。有什么建議可以解決這個問題嗎?
uj5u.com熱心網友回復:
您不能在 a 中執行此操作query,但是在聚合中您可以將$filter添加到您的管道中,如下所示:
db.collection.aggregate([
{
$project: {
my_array: {
$filter: {
input: "$my_array",
as: "elem",
cond: {
$ne: [
{},
"$$elem"
]
}
}
}
}
}
])
蒙戈游樂場
但是,除非這是“正確”的行為,否則我建議您清理資料庫,維護“正確”結構比更新所有查詢的所有查詢要簡單得多。
您可以使用此更新洗掉這些物件:
db.collection.update({
"myarray": {}
},
[
{
"$set": {
"my_array": {
$filter: {
input: "$my_array",
as: "elem",
cond: {
$ne: [
{},
"$$elem"
]
}
}
}
}
},
],
{
"multi": false,
"upsert": false
})
蒙戈游樂場
uj5u.com熱心網友回復:
假設您有這樣的檔案,帶有my_array欄位:
{ "my_array" : [ ] }
{ "my_array" : [ { "a" : 1 } ] } // #(1)
{ "my_array" : null }
{ "some_fld" : "some value" }
{ "my_array" : [ { } ] }
{ "my_array" : [ { "a" : 2 }, { "a" : 3 } ] } // #(2)
并且,以下聚合將進行過濾,結果將包含兩個檔案(1)和(2):
db.collection.aggregate([
{
$match: {
$expr: {
$and: [
{ $eq: [ { $type: "$my_array" }, "array" ] },
{ $gt: [ { $size: "$my_array" }, 0 ] },
{ $ne: [ [{}], "$my_array" ] }
]
}
}
}
])
這也適用于一種find方法:
db.collection.find({
$expr: {
$and: [
{ $eq: [ { $type: "$my_array" }, "array" ] },
{ $gt: [ { $size: "$my_array" }, 0 ] },
{ $ne: [ [{}], "$my_array" ] }
]
}
})
要洗掉該my_array欄位,請在檔案為空時從檔案中洗掉該欄位,然后嘗試此聚合:
db.collection.aggregate([
{
$addFields: {
my_array: {
$cond: [
{$and: [
{ $eq: [ { $type: "$my_array" }, "array" ] },
{ $gt: [ { $size: "$my_array" }, 0 ] },
{ $ne: [ [{}], "$my_array" ] }
]},
"$my_array",
"$$REMOVE"
]
}
}
}
])
結果:
{ }
{ "my_array" : [ { "a" : 1 } ] }
{ }
{ "a" : 1 }
{ }
{ "my_array" : [ { "a" : 2 }, { "a" : 3 } ] }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345422.html
上一篇:POSThttp://localhost:3001/createPost404(NotFound)EXPRESS&REACT
