我看過這里:https ://codelikethis.com/lessons/db/mongodb-array-queries和這里:https ://www.mongodb.com/community/forums/t/what-is-the-best-way- to-query-an-array-of-sub-documents-in-mongodb/115315嘗試找出如何僅從父檔案中查詢匹配的子檔案。
以下是資料示例:
{'testname':'process',
'jobId':"job1",
"vt_cond":"cond1",
"testData":[{
'chip':'c1',
'name':'block1'},
{
'chip':'c1',
'name':'block1'},
{
'chip':'c1',
'name':'block2'},
{
'chip':'c1',
'name':'block3'}]}
它包含“testData”欄位中的子檔案。我想做的是如下所示:
db.collection.find({'jobId':'job1', 'testData.name':'block3'})
并讓它回傳以下內容:
{'testname':'process',
'jobId':"job1",
"vt_cond":"cond1",
"testData":[{'chip':'c1',
'name':'block3'}]}
我了解mongodb 檔案宣告它將查詢并回傳與子檔案查詢條件中的條件匹配的檔案。確實如此。我得到了上面的整個示例檔案。無論如何我可以在與上述類似的條件下進行類似的查詢,并且只回傳具有所需子檔案的父節點,而不是所有子檔案?
uj5u.com熱心網友回復:
選項 1:您可以在專案部分使用 $elemMatch,如下所示:
db.collection.find({
"jobId": "job1",
"testData.name": "block3"
},
{
"testData": {
"$elemMatch": {
name: "block3"
}
}
})
解釋:
查找物件并僅投影符合條件的陣列子物件
注意:這僅在您只需要陣列中的 1x 個匹配元素時才有效,如果陣列中匹配條件的元素超過一個,則最好使用選項 2。
操場
選項 2:aggregate/$filter(涵蓋當陣列中有多個物件與過濾器匹配的情況)
db.collection.aggregate([
{
$match: {
"jobId": "job1",
"testData.name": "block3"
}
},
{
"$addFields": {
"testData": {
"$filter": {
"input": "$testData",
"as": "t",
"cond": {
$eq: [
"$$t.name",
"block3"
]
}
}
}
}
}
])
解釋:
- 匹配檔案
- 僅過濾物件陣列中的匹配物件
游樂場 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/495724.html
標籤:python-3.x mongodb mongodb查询 pymongo
下一篇:MongoServerError:cannotcreateanewcollectionalreadyusing500collectionof500,errorcode:8000
