问题描述
[{ '_id' : ObjectId('55f181e43fdda0be857daaf4'), 'form_info' : [ { 'val' : '王思聪', 'id' : '1'}, { 'val' : '13800138000', 'id' : '2'} ], 'tags' : [], '__v' : 0},{ '_id' : ObjectId('55f181e43fdda0f48578acf4'), 'form_info' : [ { 'val' : '李丽珍', 'id' : '1'}, { 'val' : '13934438010', 'id' : '2'} ], 'tags' : [], '__v' : 0}]
如果我想筛选form_info数组内符合 成员对象内id为1,val为王思聪且id为2,val为13800138000 的记录。
即结果是:
[{ '_id' : ObjectId('55f181e43fdda0be857daaf4'), 'form_info' : [ { 'val' : '王思聪', 'id' : '1'}, { 'val' : '13800138000', 'id' : '2'} ], 'tags' : [], '__v' : 0}]
该怎么写好? 谢谢大大们
问题解答
回答1:能看一下你的这个记录在数据库中怎么存储的吗?是这样:
db.test6.insert({'test':[{ '_id' : ObjectId('55f181e43fdda0be857daaf4'), 'form_info' : [ { 'val' : '王思聪', 'id' : '1'}, { 'val' : '13800138000', 'id' : '2'} ], 'tags' : [], '__v' : 0},{ '_id' : ObjectId('55f181e43fdda0f48578acf4'), 'form_info' : [ { 'val' : '李丽珍', 'id' : '1'}, { 'val' : '13934438010', 'id' : '2'} ], 'tags' : [], '__v' : 0}]})
还是数组里面的每个子文档都是一个独立的记录?真要是按你上边展示的这样,那你直接查_id不就取出唯一的记录了。如果按我的理解,那执行这个查询:
> db.test6.find({'test._id':ObjectId('55f181e43fdda0be857daaf4')},{'test.$':1}).pretty();{ '_id' : ObjectId('55f255aef566c6baf2af1fac'), 'test' : [{ '_id' : ObjectId('55f181e43fdda0be857daaf4'), 'form_info' : [{ 'val' : '王思聪', 'id' : '1'},{ 'val' : '13800138000', 'id' : '2'} ], 'tags' : [ ], '__v' : 0} ]}
就好了
回答2:正在学习mongodb,尝试回答下sf上的一些问题。
这个是mongodb内嵌数组的查询,在已知索引的情况下可以使用数字索引查询。
使用数组索引匹配内嵌文档的字段
因此查询可以这样写:
db.user.find({’form_info.0.id’: ’1’, ’form_info.0.val’: ’王思聪’, ’form_info.1.id’: ’2’, ’form_info.1.val’: ’13800138000’})