MongoDB:在数字或字符串数​​组上使用$ elemMatch

Sea*_*ory 1 mongoose mongodb

我正在为我的应用中的商品(产品)制作用户评级(竖起大拇指/竖起大拇指).

我似乎能够通过一组对象实现我想要的东西,但我想知道mongodb是否提供了一种使用数字数组(user_ids)来实现此目的的方法.

db.items.insert({up: 2, down: 3, u_up: [{id: 1}, {id:2}], u_down: [3,4,5]})
db.items.insert({up: 3, down: 3, u_up: [{id: 1}, {id:2}, {id:3}], u_down: [7,8,9]})
db.items.insert({up: 0, down: 0, u_up: [], u_down: []})
db.items.insert({up: 2, down: 2, u_up: [{id:2},{id:3}], u_down: [7,9]})
Run Code Online (Sandbox Code Playgroud)

为了帮助解释我想要做的事情,我已经将u_up(点击了大拇指的用户)实现为一个对象数组,将u_down(已经点击的用户)实现为一组数字.上下字段是该特定产品的上下投票的总运行次数.

只看u_up,如果我运行以下查询,

db.items.find({}, {up: 1, u_up: {$elemMatch: {id: 2}}})
Run Code Online (Sandbox Code Playgroud)

让我回到我想要的东西..用户2的所有四个项目,但只有当用户投票时才填充u_up.所以,我知道他已经对这个特定的项目进行了投票,同时还找回了他没有投票的所有项目.我不想知道查询结果中的其他用户.

 {"_id": 2345,"up": 2,
   "u_up": [{"id": 2}]}

 {"_id": 4432,
   "up": 3,
   "u_up": [{"id": 2}]}

 {"_id": 2345,
   "up": 0}

 { "_id": 2345,
   "up": 2,
   "u_up": [{"id": 2}]}
Run Code Online (Sandbox Code Playgroud)

为每个用户存储整个对象似乎有点浪费,我希望改为使用数组(就像我上面为u_down实现的那样).

mongodb中是否有查询可以实现此目的?或者另外一个会返回一个标志或者某个东西来表示用户已经投票或者已经投票,但是还要退还他没有投票的产品?

谢谢.

Sea*_*ory 5

看来这就是诀窍......

db.items.find({}, {down: 1, u_down : {$elemMatch: {$in: [9]}}})
Run Code Online (Sandbox Code Playgroud)

给予

 {"_id": 23123,
   "down": 3}

 {"_id": 34123,
   "down": 3,
   "u_down": [9]}

 {"_id": 23412,
   "down": 0}

 {"_id": 12332,
   "down": 2,
   "u_down": [9]}
Run Code Online (Sandbox Code Playgroud)

如果有人知道我如何用mongo u_down转换为true旗帜,就像下面的那个.我很想知道.

 {"_id": 23412,
   "down": 0}

 {"_id": 12332,
   "down": 2,
   "u_down": true}
Run Code Online (Sandbox Code Playgroud)