我正在学习MongoDB,我决定尝试使用$ pop进行一些练习:
MongoDB Enterprise > db.produits.insert({compteur: 100001, tab:['a','b','c']})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$push: {tab: 'd'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c", "d" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$pop:{tab:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$push:{tab:['d', 'e', 'f', 'g']}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c", [ "d", "e", "f", "g" ] ] }
MongoDB Enterprise > db.produits.update({compteur: 100001}, {$pop:{tab:3}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
MongoDB Enterprise > db.produits.find({compteur: 100001});
{ "_id" : ObjectId("57c011106d76da1c1e34edd2"), "compteur" : 100001, "tab" : [ "a", "b", "c" ] }
我不理解逻辑:
最后一个pop删除了数组中的数组,但为什么呢?
我要求弹出3,我认为它可以:
1 - 弹出选项卡内标签中的最后3个条目(所以" e"," f"和" g")
2 - 将表格弹出为单个元素,然后弹出2元素(So" b"" c")
我在这里,我不明白发生了什么:/
答案 0 :(得分:1)
我不认为这是一个错误,因为这是 $pop
运算符的预期行为。它删除了数组的第一个或最后一个元素,在这种情况下,数组是一个堆栈,不会删除多个元素。所以3对1作为一个值被视为相同的(感谢@JohnnyHK这个引用)。
由于选项卡字段中的最后一项是数组,因此操作
db.produits.update({compteur: 100001}, {$pop:{tab:3}});
正确弹出最后一个元素(即数组)。
您正在寻找的操作可能是
db.produits.update({compteur: 100001}, {$pop:{"tab.3":-1}});
弹出嵌入数组“d”中的第一个元素,或
db.produits.update({compteur: 100001}, {$pop:{"tab.3":1}});
弹出最后一个“g”。
我想也许您正在寻找 $slice
运算符来“弹出”多个元素。