Если я правильно понимаю, вы хотели бы оставить только токены, значение _id которых соответствует "foo" или "bar", верно?
С учетом коллекции:
> db.test.find()
{
"_id" : 1,
"name" : "Doc1",
"tokens" : [
{
"_id" : "foo",
"tf" : 1,
"tf_idf" : 1
},
{
"_id" : "buzz",
"tf" : 2,
"tf_idf" : 2
}
]
},
{
"_id" : 2,
"name" : "Doc2",
"tokens" : [
{
"_id" : "bar",
"tf" : 3,
"tf_idf" : 3
},
{
"_id" : "bing",
"tf" : 4,
"tf_idf" : 4
}
]
}
Следующее обновление должно выполнить то, что вы хотите сделать. Это удалит все вложенные документы, значение _id которых соответствует «foo» или «bar» из массива «tokens» каждого документа.
> db.test.update({}, {$pull:{tokens:{_id:{$nin:["foo", "bar"]}}}}, false, true)
> db.test.find()
{ "_id" : 1, "name" : "Doc1", "tokens" : [ { "_id" : "foo", "tf" : 1, "tf_idf" : 1 } ] }
{ "_id" : 2, "name" : "Doc2", "tokens" : [ { "_id" : "bar", "tf" : 3, "tf_idf" : 3 } ] }
Документацию Mongo об операторе $ pull можно найти здесь:
http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull
Надеюсь, это поможет вам сделать то, что вам нужно. Удачи!