我需要从MongoDB中的不同集合中的两个文档(其中包含1个公共字段,不更改数据库)中获取数据。我是新手,请帮助我
a = db.users.find(username:'abc@xyz.com')
b = db.tasks.find(username:'abc@xyz.com')
如何获得a和b合并的变量c?
请帮忙。这可能是微不足道的,但对我有帮助。
答案 0 :(得分:2)
您可以使用BSON Api中的merge()
method。它会给你b结合a并将结果存储在b中。在执行此操作之前,您可能希望在c中复制b。
答案 1 :(得分:2)
如果用户在两个集合中都是唯一的,请使用函数findOne(),因为find()返回一个游标。因此,要在mongoDB控制台中实现两个对象的合并,可以使用以下代码:
function mergeObjects(a,b) {
res = new Object();
for (attr in a)
res[attr] = a[attr];
for (attr in b)
res[attr] = b[attr];
// only if you wanna save it in a document again
delete res["_id"];
return res;
}
a = db.users.findOne({"username" : 'abc@xyz.com'})
b = db.tasks.findOne({"username" : 'abc@xyz.com'})
c = mergeObjects(a,b)
希望这可以解决您的问题。
答案 2 :(得分:0)
对于数据聚合,您最好不要熟悉MongoDB的map / reduce功能。 您可以阅读更多相关信息here。
一旦弄明白,编写Map(检索数据)和Reduce(聚合数据)函数就不难了。
答案 3 :(得分:0)
您必须在应用程序中执行此操作。不要担心必须运行两个查询,因为它不一定比运行一个复杂的查询慢。
答案 4 :(得分:0)
我知道这可能不是你的情况,但是如果你使用clojure,一个优雅的解决方案是在从mongo检索文档后使用listViewLeaderBoard = (ListView) findViewById(R.id.listView_leader_board);
reference = FirebaseDatabase.getInstance().getReference("score");
leaderBoards = new ArrayList<>();
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){
LeaderBoard leaderBoard = postSnapshot.getValue(LeaderBoard.class);
leaderBoards.add(0,leaderBoard);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Collections.sort(leaderBoards);
CustomLeaderBoardAdapter adapter = new CustomLeaderBoardAdapter(getApplicationContext(),R.layout.leader_board_list_layout,leaderBoards);
listViewLeaderBoard.setAdapter(adapter);
adapter.notifyDataSetChanged();
函数。
merge-with